3.5.3
3.5.3
基于 SpringBoot 3.5.6 开发的 Java 后端后台管理业务基础框架,常用的业务功能已经集成,开箱即用,相关使用说明,可以参考:
主要更新
3.5.3 定时任务,控制台日志管理功能 、 SQL注入的安全问题相关优化 、解决WebSocket 多模块并发问题
工具包
- 【新增】定时任务,控制台日志管理功能,将在日志打印的日志屏蔽(支持INFO、WARN、DEBUG、报错信息等),转而归纳至数据库中,减少日志中的无用、重复信息(报错信息还是会显示在日志中,防止出现报错消息没归至数据库导致一直报错没被发现),支持@Scheduled开启的定时任务,支持定时任务中使用虚拟线程、feign、dubbo、多级调用的日志打印。使用方法:
引入模块:
<dependency> <groupId>io.github.taybct</groupId> <artifactId>spring-taybct-scheduled-log-centralized</artifactId> <version>${tool-version}</version> </dependency>nacos配置为true:
scheduled-log-centralized: #是否开启定时任务日志管理 enabled: true如果是@Scheduled的定时任务,使用@ManagedScheduled注释包裹即可(name参数不传的话默认拿当前方法名称作为methodName)
如果是RedisScheduledTaskJob管理的,更换run的执行方法(其中"clearDirtyData"会作为methodName使用):
@Override public void run(Map<String, Object> params) { log.debug("clearDirtyData => 当前线程名称 {} ", Thread.currentThread().getName()); log.debug(">>>>>> 清理权限脏数据任务开始 >>>>>> "); sysRolePermissionService.clearDirtyData(); log.debug(">>>>>> 清理权限脏数据任务结束 >>>>>> "); }修改为
@Override public void run(Map<String, Object> params) { RedisScheduledJobTemplate.execute("clearDirtyData", () ->doRun(params), scheduledLogCollector); } private void doRun(Map<String, Object> params){ log.debug("clearDirtyData => 当前线程名称 {} ", Thread.currentThread().getName()); log.debug(">>>>>> 清理权限脏数据任务开始 >>>>>> "); sysRolePermissionService.clearDirtyData(); log.debug(">>>>>> 清理权限脏数据任务结束 >>>>>> "); }RedisScheduledJobTemplate 工具类,添加多种管理日志模式,用于适配定时任务统一入口,nacos 需要添加参数:
scheduled-log-centralized: #是否开启定时任务日志管理 enabled: true #一共有:ALL(全管理),WHITE_LIST,BLACK_LIST,NONE(不管理),默认为WHITE_LIST module: BLACK_LIST #module值为WHITE_LIST时,进行日志管理的接口列表 logCollectionWhiteList: - /demo/testSchedule2 - /demo/testSchedule1 #module值为BLACK_LIST时,进行日志管理的接口列表 logCollectionBlackList:
【新增】新增 AnnotationScanner 工具类,用于扫描指定的包名和注解来创建 bean,并且结合了 @Conditional 注解
【优化】分布式任务调度 bean 注册问题
- @Scheduler 注解不再自动注册 bean,通过配置包路径扫描注册
- 以前是一个任务调度就注册一个 @Scheduler bean,这样操作会比较繁琐,在开发的过程中,我们注意到,任务调度用得最多的就是调用某个模块的已有的接口去做调度,实际入口 bean 相似度极高,所以没必要因为要调度某个接口就重新再写一遍 bean,现在是配置一个任务调度就创建一个新的实例
- 为此,加入了唯一键这个概念,原来的任务键只能用注解 @Scheduler,如果是使用配置文件来配置任务调度,唯一键就是配置 key,如果使用数据库来配置的争议是使用 id 主键来做唯一键,需要将原有的数据库表 scheduled_task 里面的 task_key 字段唯一限制去掉,因为可能会存在多个 task_key 来表示使用了同一个入口,但是基于传入的 params 不同会调度对应的接口
【优化】SqlPageParams 新增 pageOrder 过滤功能,防止 SQL 注入,可以根据定义类型根据类型字段过滤,也可以继续添加字段过滤
- 同时应用了 mybatis plus 的 SQL 注入检查机制 checkSqlInjection,参考:数据安全保护 | MyBatis-Plus
【优化】资源扫描读取问题,结合 ClassPathResource 和 FileSystemResource 读取 jar 内外的文件,可以使用 ResourceUtil 来扫描 resources 文件以确保无论是 jar 包内外都能读取
【修复】 cache 缓存前缀固定无法修改的问题,这对于需要使用 redis 集群的里面统一 redis 前缀会有影响,现在,可以通过设置 jvm 参数 -Dtaybct.cache.prefix="xx:" 或者直接添加环境变量 taybct_cache_prefix=xx: 来动态的去设置这个前缀,这只是会影响到部分在 tools 框架里面的功能,业务框架的代码如果还有这些前缀的设置,需要自行去修改
框架
【更新】
spring-taybct-tools升级到3.5.2【新增】定时任务,控制台日志管理功能,将在日志打印的日志屏蔽(支持INFO、WARN、DEBUG、报错信息等),转而归纳至数据库中,减少日志中的无用、重复信息(报错信息还是会显示在日志中,防止出现报错消息没归至数据库导致一直报错没被发现),支持@Scheduled开启的定时任务,支持定时任务中使用虚拟线程、feign、dubbo、多级调用的日志打印。使用方法:
1.引入模块:
<dependency> <groupId>io.github.taybct</groupId> <artifactId>spring-taybct-scheduled-log-centralized</artifactId> </dependency>2.nacos配置为true:
scheduled-log-centralized: #是否开启定时任务日志管理 enabled: true #一共有:ALL(全管理),WHITE_LIST,BLACK_LIST,NONE(不管理),默认为WHITE_LIST module: BLACK_LIST #module值为WHITE_LIST时,进行日志管理的接口列表 logCollectionWhiteList: /demo/testSchedule2 /demo/testSchedule1 #module值为BLACK_LIST时,进行日志管理的接口列表 logCollectionBlackList:3.如果是@Scheduled的定时任务,使用@ManagedScheduled注释包裹即可(name参数不传的话默认拿当前方法名称作为methodName)
4.如果是RedisScheduledTaskJob管理的,更换run的执行方法(其中"clearDirtyData"会作为methodName使用):@Override public void run(Map<String, Object> params) { log.debug("clearDirtyData => 当前线程名称 {} ", Thread.currentThread().getName()); log.debug(">>>>>> 清理权限脏数据任务开始 >>>>>> "); sysRolePermissionService.clearDirtyData(); log.debug(">>>>>> 清理权限脏数据任务结束 >>>>>> "); }修改为:
@Override public void run(Map<String, Object> params) { RedisScheduledJobTemplate.execute("clearDirtyData", () ->doRun(params), scheduledLogCollector); } private void doRun(Map<String, Object> params){ log.debug("clearDirtyData => 当前线程名称 {} ", Thread.currentThread().getName()); log.debug(">>>>>> 清理权限脏数据任务开始 >>>>>> "); sysRolePermissionService.clearDirtyData(); log.debug(">>>>>> 清理权限脏数据任务结束 >>>>>> "); }【新增】websocket 统一入口改造,避免多个模块部署带来的 session 不一致问题
【新增】新增了任务调度调用服务接口的新的任务调度模式,不再需要写一个任务调度就写一遍 bean,直接在前端配置都可以完成定时调用某个模块的某个接口,详情查看 ServiceApiTask
注意
- 现在是一个调度入口可以根据 params 传入参数调用对应的接口,所以 task_key 不再是唯一的,@Scheduler 注解也不再注册 bean,需要在配置文件里面配置 taybct.scheduled.packages-to-scan 去扫描需要注册的任务调度入口
- ServiceApiTask 只适用于微服务项目,单体项目需要自行写类似的入口
【优化】优化所有和 SqlPageParams 相关的使用
【优化】删掉所有原来的 Controller 注册机制,因为现在是全开放出来的源码,已经不需要这个了,同时也删掉原来的 Service 注册机制,改为常用的 @Service 注解
所有被删除相关功能都已经打上 @Deprecated ,从 3.5.3 版本开始不再推荐使用,后续会直接删除