在当前的Java微服务系统中,活动开始前提醒是通过配置XXL-JOB定时任务来实现的,该任务每分钟扫描一次,检查当前时间是否在活动开始前的指定时间段内。为了优化这一业务流程,我们希望在创建活动时直接生成一个指定时间的定时任务,从而减少不必要的数据库查询并提高系统的效率。
具体来说,需要在创建活动时计算出提醒的具体时间,并通过调用XXL-JOB的API动态创建一个定时任务。这样可以在活动创建时就确定好提醒的时间点,避免频繁的扫描操作。
# 一、添加依赖
确保你的项目中包含了 XXL-JOB 的客户端依赖。如果使用 Maven,可以在 pom.xml
中添加如下依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
1
2
3
4
5
2
3
4
5
# 二、配置 XXL-JOB 客户端
在你的应用配置文件(如 application.yml
或 application.properties
)中配置 XXL-JOB 客户端参数。
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: your-app-name
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 30
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 三、创建活动并生成定时任务
在创建活动的方法中,调用 XXL-JOB 的 API 来创建一个新的定时任务。
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam;
import com.xxl.job.core.util.XxlJobDynamicScheduler;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class ActivityService {
public void createActivity(Activity activity) {
// 保存活动基本信息到数据库
saveActivity(activity);
// 计算提醒时间
LocalDateTime reminderTime = activity.getStartTime().minusHours(1); // 假设提前1小时提醒
Date triggerTime = Date.from(reminderTime.atZone(ZoneId.systemDefault()).toInstant());
// 创建定时任务
TriggerParam triggerParam = new TriggerParam();
triggerParam.setJobId(1); // 你需要为这个提醒任务分配一个固定的jobId
triggerParam.setExecutorHandler("activityReminderHandler"); // 对应执行器中的任务处理器
triggerParam.setTriggerTime(triggerTime.getTime());
// 调用XXL-JOB API创建定时任务
ReturnT<String> result = XxlJobDynamicScheduler.triggerJob(triggerParam);
if (result.getCode() == 200) {
System.out.println("定时任务创建成功");
} else {
System.err.println("定时任务创建失败: " + result.getMsg());
}
}
private void saveActivity(Activity activity) {
// 保存活动到数据库的逻辑
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 四、配置任务处理器
在你的 XXL-JOB 执行器中,配置一个任务处理器来处理提醒逻辑。
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class ActivityReminderJobHandler {
@XxlJob("activityReminderHandler")
public ReturnT<String> execute(String param) {
// 提醒逻辑
System.out.println("活动提醒: " + param);
return ReturnT.SUCCESS;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 参考资料
XXL-JOB调度中心与执行器通讯过程源码理解:https://blog.csdn.net/it_boy_elite/article/details/138980389