likes
comments
collection
share

续-开发组件更新-提效工具分享

作者站长头像
站长
· 阅读数 11

前言

小一个月没更新了,有各种各样的事啦,这一篇有点水吧。围绕两方面,开发组件更新以及IDEA插件的分享,题目和我一样水,有点像是日本轻小说取名了,整这么长。本篇的触动来源于,我今天偶然发现之前开源的组件库有3个star还有一个fork,有人在关注,那赶紧更新更新,同时也写一篇文章,说明说明。

正文

开发组件更新

小仓库地址

gitee.com/cloudswzy/g…

上一篇地址

Spring Boot Starter开发指北(案例+代码地址)

redis幂等性校验

构成

基于Lua和AOP,切点是@IdempotencyCheck,注解参数是单次幂等性校验有效时间和幂等性校验Key,使用场景是前后端的接口

  • com.cloud.tool.annotation.IdempotencyCheck
  • com.cloud.tool.aop.IdempotencyCheckHandler
  • com.cloud.tool.service.LuaTool#idempotencyCheck

原理及作用

通知部分只有@Around,Key值默认默认为应用名(spring.application.name):当前方法名:当前登录人ID(没有SSO就是null):入参的md5值,如果checkKey不为空就会替换入参和当前登录人--->应用名:当前方法名:checkKey。

作用是在checkTime时间内相同checkKey只能运行一次,典型的固定时间窗口算法。

PS:这里使用入参的MD5值是为了避免过长入参导致key值过大

使用方法

续-开发组件更新-提效工具分享

Caffeine配置

构成

一般是推荐随用随建,这里提供一个通用配置案例,一般来说配置初始大小、最大数量、过期时间就可以。

  • com.cloud.tool.config.CaffeineConfig

使用方法

@Autowired
@Qualifier("commonCaffeine")
private Cache<String, Object> caffeine;

Object countryObj = caffeine.getIfPresent("country");
if (Objects.isNull(countryObj)) {
    //缓存没有,从数据库获取并填入缓存
    caffeine.put("country", country);
    return country;
} else {
//缓存有,直接强制转换后返回
    return (Map<String, String>) countryObj;
}

Redisson配置

构成

修改String编码为默认编码MarshallingCodec,配置文件中主要是做了一个客户端的连接参数配置以及超时时间配置。

  • com.cloud.tool.config.MyRedissonConfig

作用

redisson官方中文文档

续-开发组件更新-提效工具分享 我是几个月前发现String序列化方式,在使用RBucket<>进行泛型转换时会报类型转换错误的异常,官方在3.18.0版本才修复了这个问题,不过我推荐没有图形客户端可视化需求的使用默认编码即可,有更高的压缩率,并且目前使用没有出现过转换异常。

目前Redis可视化工具最推荐官方的RedisInsight-v2,纯免费也还是比较好用,除此之外推荐使用Another Redis Desktop Manager。

Redisson我个人感觉是非常方便的一款用于操作Redis的客户端工具,中文文档20年更新的建议看个大概即可,一定要看英文文档,只有英文文档在持续更新。

使用方法

@Autowiredprivate RedissonClient redissonClient;

public BigDecimal getIntervalQty(int itemId, Date startDate, Date endDate) {
    String cacheKey = "dashboard:intervalQty:" + itemId + "-" + startDate + "-" + endDate;
    RBucket<BigDecimal> bucket = redissonClient.getBucket(cacheKey);
    BigDecimal cacheValue = bucket.get();
    if (cacheValue != null) {
        return cacheValue;
    } else {
        BigDecimal intervalQty = erpInfoMapper.getIntervalQty(itemId, startDate, endDate);
        BigDecimal res = Optional.ofNullable(intervalQty).orElse(BigDecimal.valueOf(0)).setScale(2,
                RoundingMode.HALF_UP);
        bucket.set(res, 16, TimeUnit.HOURS);
        return res;
    }
}

线程池配置

构成

按照CPU密集型和IO密集型配置了两种线程池,普通的ThreadPoolTaskExecutor,Spring默认使用LinkedBlockingQueue、拒绝策略使用默认的抛异常、修改线程名前缀。

  • com.cloud.tool.config.ThreadPoolConfig
  • com.cloud.tool.properties.ToolProperties

使用方法

@Async("ioDenseExecutor")

@Autowired
@Qualifier("cpuForkJoinPool")
private ForkJoinPool cpuForkJoinPool;
CompletableFuture.runAsync(() -> {
}, cpuForkJoinPool).handle((....

强制Spring读取配置文件使用UTF-8

重写配置类RewritePropertiesPropertySourceLoader,固定UTF-8编码,避免中文读取乱码。spring.factories里为org.springframework.boot.env.PropertySourceLoader接口提供一个新的实现类,并且使用@Order调高优先级。

IDEA插件推荐

GenerateAllSetter

好东西,快速生成setter的好东西,更新了之后还能生成getter了,更好用了。

GsonFormatPlus

将JSON快速转换成类,还可以生成包含内部类,并且自带驼峰和JSON注解,这不美滋滋?

MyBatisX

没啥都不能没这个,跳转XML太香了,还能标红提示mapper和XML是否正确映射。

更新记录

续-开发组件更新-提效工具分享

续-开发组件更新-提效工具分享

写在最后

前几天阳了,精神稍有不振,最近干活都是半睡半醒,比较难受,烧了两天之后好多了,到现在七天过去基本没啥症状,还有些咳嗽咳痰,一切安好。

让我很意外的是,总共8个月的更新,其实没多少新东西,这个放出来的通用组件,其实是我在公司写的工具组件和业务组件的整合,两个组件加起来竟然才五个左右的小更新是让我没有想到的。回头看了下更新记录,业务组件围绕mybatis-plus增加了两个插件、对excelTool进行了十几次的优化这些确实也没法写。工具组件则是增加了幂等性校验器、移除了redisTool改用redisson、修改了各式各样的BUG,确实也没啥改动。

暂时没想好下一篇更新啥,设计模式的搁浅了,感觉没啥写的,网上类似的太多了。年终盘点感觉没啥必要,之前盘点过了,所以下个月见。