Commit f8b4a08faef7f2f82a6b8899ec889a2caa49d870

Authored by YunaiV
1 parent d4417d24

code review:访问日志、错误日志的清理 Job 实现

Showing 14 changed files with 23 additions and 1 deletions
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java
@@ -30,6 +30,7 @@ public class YudaoQuartzAutoConfiguration { @@ -30,6 +30,7 @@ public class YudaoQuartzAutoConfiguration {
30 return new SchedulerManager(scheduler.get()); 30 return new SchedulerManager(scheduler.get());
31 } 31 }
32 32
  33 + // TODO @j-sentinel:这个 job,先拿到 infra biz 里面实现哈;
33 @Bean 34 @Bean
34 public JobLogJobHandler jobLogJobHandler(LogJobProperties logJobProperties){ 35 public JobLogJobHandler jobLogJobHandler(LogJobProperties logJobProperties){
35 return new JobLogJobHandler(logJobProperties); 36 return new JobLogJobHandler(logJobProperties);
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/JobLogJobHandler.java
@@ -7,7 +7,9 @@ import lombok.extern.slf4j.Slf4j; @@ -7,7 +7,9 @@ import lombok.extern.slf4j.Slf4j;
7 7
8 import javax.annotation.Resource; 8 import javax.annotation.Resource;
9 9
  10 +// TODO @j-sentinel:名字和项目里其它保持统一,可以叫 JobLogCleanJob,不用带 handler 哈
10 /** 11 /**
  12 + * // TODO @j-sentinel:要写下类注释噢,就是这个类要干啥;然后下面两个应该是 @author 和 @since
11 * @Author: j-sentinel 13 * @Author: j-sentinel
12 * @Date: 2023/9/30 20:40 14 * @Date: 2023/9/30 20:40
13 */ 15 */
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/LogJobProperties.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.quartz.core.job; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.quartz.core.job;
3 import lombok.Data; 3 import lombok.Data;
4 import org.springframework.boot.context.properties.ConfigurationProperties; 4 import org.springframework.boot.context.properties.ConfigurationProperties;
5 5
  6 +// TODO @j-sentinel:这个配置类,先暂时不做,每个 Job 里面定一个静态类。其实不是所有的变量,都需要配置化,因为它本身基本也不会改动。
6 /** 7 /**
7 * @Author: j-sentinel 8 * @Author: j-sentinel
8 * @Date: 2023/9/30 16:17 9 * @Date: 2023/9/30 16:17
yudao-framework/yudao-spring-boot-starter-web/pom.xml
@@ -62,11 +62,11 @@ @@ -62,11 +62,11 @@
62 </dependency> 62 </dependency>
63 63
64 <!-- Job 定时任务相关 --> 64 <!-- Job 定时任务相关 -->
  65 + <!-- TODO @j-sentinel:去掉这个依赖哈; -->
65 <dependency> 66 <dependency>
66 <groupId>cn.iocoder.boot</groupId> 67 <groupId>cn.iocoder.boot</groupId>
67 <artifactId>yudao-spring-boot-starter-job</artifactId> 68 <artifactId>yudao-spring-boot-starter-job</artifactId>
68 </dependency> 69 </dependency>
69 -  
70 </dependencies> 70 </dependencies>
71 71
72 </project> 72 </project>
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiAccessLogJobHandler.java
@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
8 8
9 import javax.annotation.Resource; 9 import javax.annotation.Resource;
10 10
  11 +// TODO @j-sentinel:同 JobLogJobHandler
11 /** 12 /**
12 * @Author: j-sentinel 13 * @Author: j-sentinel
13 * @Date: 2023/9/30 16:13 14 * @Date: 2023/9/30 16:13
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiErrorLogJobHandler.java
@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
8 8
9 import javax.annotation.Resource; 9 import javax.annotation.Resource;
10 10
  11 +// TODO @j-sentinel:同 JobLogJobHandler
11 /** 12 /**
12 * @Author: j-sentinel 13 * @Author: j-sentinel
13 * @Date: 2023/9/30 16:13 14 * @Date: 2023/9/30 16:13
yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApi.java
@@ -18,10 +18,12 @@ public interface ApiAccessLogApi { @@ -18,10 +18,12 @@ public interface ApiAccessLogApi {
18 */ 18 */
19 void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); 19 void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO);
20 20
  21 + // TODO @j-sentinel:这个我们先提供接口在 API,而是 infra 模块自己清理先哈;
21 /** 22 /**
22 * 清理 @param accessLogJobDay 天的访问日志 23 * 清理 @param accessLogJobDay 天的访问日志
23 * 24 *
24 * @param accessLogJobDay 超过多少天就进行清理 25 * @param accessLogJobDay 超过多少天就进行清理
25 */ 26 */
26 void jobCleanAccessLog(Integer accessLogJobDay); 27 void jobCleanAccessLog(Integer accessLogJobDay);
  28 +
27 } 29 }
yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApi.java
@@ -18,10 +18,12 @@ public interface ApiErrorLogApi { @@ -18,10 +18,12 @@ public interface ApiErrorLogApi {
18 */ 18 */
19 void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); 19 void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO);
20 20
  21 + // TODO @j-sentinel:这个我们先提供接口在 API,而是 infra 模块自己清理先哈;
21 /** 22 /**
22 * 清理 @param errorLogJobDay 天的访问日志 23 * 清理 @param errorLogJobDay 天的访问日志
23 * 24 *
24 * @param errorLogJobDay 超过多少天就进行清理 25 * @param errorLogJobDay 超过多少天就进行清理
25 */ 26 */
26 void jobCleanErrorLog(Integer errorLogJobDay); 27 void jobCleanErrorLog(Integer errorLogJobDay);
  28 +
27 } 29 }
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java
@@ -41,7 +41,12 @@ public interface JobLogMapper extends BaseMapperX&lt;JobLogDO&gt; { @@ -41,7 +41,12 @@ public interface JobLogMapper extends BaseMapperX&lt;JobLogDO&gt; {
41 ); 41 );
42 } 42 }
43 43
  44 + // TODO @j-sentinel:一般来说,我们 mapper 只提供 crud 的操作,所以这个方法的命名,建议是 deleteByCreateTimeLt;
  45 + // 然后,参数是 (crateTime, count),由 service 传入
  46 + // 这里为什么有 lt 呢,这个其实是延续 spring data 的 method 描述的命名习惯,lt 表示小于;
  47 + // 另外,timingJobCleanLog 的具体 sql 这么写,性能是比较差的;可以直接 delete * from job_log where create_time < xxx order by id limit 100;
44 Integer timingJobCleanLog(@Param("jobCleanRetainDay") Integer jobCleanRetainDay); 48 Integer timingJobCleanLog(@Param("jobCleanRetainDay") Integer jobCleanRetainDay);
45 49
  50 + // TODO @j-serntinel:optimize table infra_job_log 就可以啦?
46 void optimizeTable(); 51 void optimizeTable();
47 } 52 }
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java
@@ -45,6 +45,7 @@ public interface ApiAccessLogMapper extends BaseMapperX&lt;ApiAccessLogDO&gt; { @@ -45,6 +45,7 @@ public interface ApiAccessLogMapper extends BaseMapperX&lt;ApiAccessLogDO&gt; {
45 ); 45 );
46 } 46 }
47 47
  48 + // TODO @j-sentinel:同 JobLogMapper 的一些优化点
48 Integer jobCleanAccessLog(@Param("accessLogJobDay") Integer accessLogJobDay); 49 Integer jobCleanAccessLog(@Param("accessLogJobDay") Integer accessLogJobDay);
49 50
50 void optimizeTable(); 51 void optimizeTable();
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java
@@ -43,6 +43,7 @@ public interface ApiErrorLogMapper extends BaseMapperX&lt;ApiErrorLogDO&gt; { @@ -43,6 +43,7 @@ public interface ApiErrorLogMapper extends BaseMapperX&lt;ApiErrorLogDO&gt; {
43 ); 43 );
44 } 44 }
45 45
  46 + // TODO @j-sentinel:同 JobLogMapper 的一些优化点
46 Integer jobCleanErrorLog(@Param("errorLogJobDay") Integer errorLogJobDay); 47 Integer jobCleanErrorLog(@Param("errorLogJobDay") Integer errorLogJobDay);
47 48
48 void optimizeTable(); 49 void optimizeTable();
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java
@@ -52,10 +52,13 @@ public class JobLogServiceImpl implements JobLogService { @@ -52,10 +52,13 @@ public class JobLogServiceImpl implements JobLogService {
52 } 52 }
53 } 53 }
54 54
  55 + // TODO @j-sentinel:这个 job,也可以忽略租户哈;可以直接使用 @TenantIgnore 注解;
55 @Override 56 @Override
56 public Integer timingJobCleanLog(Integer jobCleanRetainDay) { 57 public Integer timingJobCleanLog(Integer jobCleanRetainDay) {
57 Integer result = null; 58 Integer result = null;
58 int count = 0; 59 int count = 0;
  60 + // TODO @j-sentinel:一般我们在写逻辑时,尽量避免用 while true 这种“死循环”,而是 for (int i = 0; i < Short.MAX) 类似这种;避免里面真的发生一些意外的情况,无限执行;
  61 + // 然后 for 里面,可以有个 if count < 100 未到达删除的预期条数,说明已经到底,可以 break 了;
59 while (result == null || DELETE_LIMIT.equals(result)){ 62 while (result == null || DELETE_LIMIT.equals(result)){
60 result = jobLogMapper.timingJobCleanLog(jobCleanRetainDay); 63 result = jobLogMapper.timingJobCleanLog(jobCleanRetainDay);
61 count += result; 64 count += result;
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java
@@ -47,6 +47,7 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService { @@ -47,6 +47,7 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService {
47 } 47 }
48 48
49 @Override 49 @Override
  50 + // TODO j-sentinel:类似 JobLogServiceImpl 的建议
50 public void jobCleanAccessLog(Integer accessLogJobDay) { 51 public void jobCleanAccessLog(Integer accessLogJobDay) {
51 TenantUtils.executeIgnore(() -> { 52 TenantUtils.executeIgnore(() -> {
52 Integer result = null; 53 Integer result = null;
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java
@@ -68,6 +68,7 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService { @@ -68,6 +68,7 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
68 } 68 }
69 69
70 @Override 70 @Override
  71 + // TODO j-sentinel:类似 JobLogServiceImpl 的建议
71 public void jobCleanErrorLog(Integer errorLogJobDay) { 72 public void jobCleanErrorLog(Integer errorLogJobDay) {
72 TenantUtils.executeIgnore(() -> { 73 TenantUtils.executeIgnore(() -> {
73 Integer result = null; 74 Integer result = null;