第一篇地址
第一篇文章中 我们对每个用户创建一个定时任务
如果用户量很大 代价有点颇大 第二篇文章是对第一篇文章做优化
思路: 能否所有用户公用一个定时器
1 创建一个定时器 【把一小时内的数据 查询出来 放入内存中】
2 创建第二个定时器【每秒去遍历集合中数据 过滤出需要数据】
1 创建第一个定时器
package com.xxl.job.executor.service.myjobhandler;
import com.alibaba.fastjson.JSON;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@Component
public class MyJobHandler {
static List<User> handlerData = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static { // 测试数据
handlerData.add(new User(1, "张三", "2020-11-20 10:45:10"));
handlerData.add(new User(2, "李四", "2020-11-20 10:45:13"));
handlerData.add(new User(3, "王五", "2020-11-20 10:45:15"));
handlerData.add(new User(4, "赵柳", "2020-11-20 10:45:20"));
handlerData.add(new User(5, "麻子", "2020-11-20 10:45:25"));
handlerData.add(new User(6, "黑子", "2020-11-20 10:45:25"));
handlerData.add(new User(7, "关于", "2020-11-20 10:45:25"));
handlerData.add(new User(8, "张飞", "2020-11-20 10:45:26"));
}
@XxlJob("handlerJob_second")
public ReturnT<String> demoJobHandler(String param) throws Exception {
String current = dateFormat.format(new Date());
System.out.println("当前时间:"+current);
Iterator<User> iterator = handlerData.iterator();
while(iterator.hasNext()){
User user = iterator.next();
if (current.equals(user.getSendTime())) {
System.out.println("当前时间:" + current + "["+user.getSendTime()+"]"+"|发送祝福给" + user.getName());
iterator.remove();//已完发送信息的数据 移除
System.out.println("集合中剩余数据" + JSON.toJSONString(handlerData));
//sendMQ(user) 发送mq异步 更新status状态 【已发送信息】
}
}
return ReturnT.SUCCESS;
}
}
2 创建第二个定时器
package com.xxl.job.executor.service.myjobhandler;
import com.alibaba.fastjson.JSON;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class MyJobFilter {
private static Logger logger = LoggerFactory.getLogger(MyJobFilter.class);
/**
* 1 查询 一小时以内的任务 放入集合 MyJobHandler.handlerData
* 2 创建定时任务 每秒执行一次 获取集合数据
* 3 如果前端更改数据 集合MyJobHandler.handlerData 数据也进行同步
* 4 如果 有遗漏数据【例如 我在查询数据库出错了 那么数据未追加到集合MyJobHandler.handlerData 中】 可以下次执行的时候将status状态为未发送且 已过了发送时间的数据查询出来 直接处理
*/
@XxlJob("myJobFile")
public ReturnT<String> demoJobHandler(String param) throws Exception {
System.out.println("过滤器执行了");
List<User> executeData=new ArrayList<>();
User user = new User(9, "刘备", "2020-11-20 10:45:26");
executeData.add(user);
//select * from user
//where sendDate BETWEEN current() and DATE_ADD(now(),INTERVAL hh 1)
MyJobHandler.handlerData.addAll(executeData);
System.out.println("追加后集合数据:"+MyJobHandler.handlerData);
XxlJobLogger.log("查询一小时内任务" + JSON.toJSONString(executeData));
// 返回执行结果
return ReturnT.SUCCESS;
}
}
3 创建调度器
执行结果