xxl-job 通过定时任务来实现延迟任务2

官网 Github springboot项目地址

第一篇地址
第一篇文章中 我们对每个用户创建一个定时任务
如果用户量很大 代价有点颇大 第二篇文章是对第一篇文章做优化

思路: 能否所有用户公用一个定时器
      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 创建调度器

在这里插入图片描述

执行结果
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值