• springboot 延时任务


    用途,某个时间发生后要在多久后去执行其他事

    package com.xxx.zhugeyl.delayService;

    import com.xxx.common.utils.DateUtils;
    import com.xxx.zhugeyl.domain.Web.TaskBase;

    import java.util.Date;
    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;

    public class DelayTask implements Delayed {

    final private TaskBase data;

    final private long expire;

    /**
    * 构造延时任务
    *
    * @param data 业务数据
    * @param expire 任务延时时间(ms)
    */
    public DelayTask(TaskBase data, long expire) {
    super();
    this.data = data;
    this.expire = expire + System.currentTimeMillis();
    }

    public TaskBase getData() {
    return data;
    }

    public long getExpire() {
    return expire;
    }

    @Override
    public boolean equals(Object obj) {
    if (obj instanceof DelayTask) {
    return this.data.getIdentifier().equals(((DelayTask) obj).getData().getIdentifier());
    }
    return false;
    }

    @Override
    public String toString() {
    return "{" + "data:" + data.toString() + "," + "延时时间:" + DateUtils.getTimestampToTime(expire,DateUtils.YYYY_MM_DD_HH_MM_SS) + "}";
    }

    @Override
    public long getDelay(TimeUnit unit) {
    return unit.convert(this.expire - System.currentTimeMillis(), unit);
    }

    @Override
    public int compareTo(Delayed o) {
    long delta = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
    return (int) delta;
    }
    }



    ===================================================================================================
    package com.xxx.zhugeyl.delayService;

    import com.xxx.zhugeyl.domain.Web.TaskBase;
    import com.xxx.zhugeyl.domain.ZTransaction;
    import com.xxx.zhugeyl.service.IZTransactionService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;

    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.Executors;

    @Component
    @Slf4j
    public class DelayQueueManager implements CommandLineRunner {

    private final DelayQueue<DelayTask> delayQueue = new DelayQueue<>();

    @Autowired
    private IZTransactionService transactionService;

    /**
    * 加入到延时队列中
    * @param task
    */
    public void put(DelayTask task) {
    log.error("加入延时任务:{}", task);
    delayQueue.put(task);
    }
    /**
    * 取消延时任务
    * @param task
    * @return
    */
    public boolean remove(DelayTask task) {
    log.error("取消延时任务:{}", task);
    return delayQueue.remove(task);
    }
    /**
    * 取消延时任务
    * @param taskid
    * @return
    */
    public boolean remove(String taskid) {
    return remove(new DelayTask(new TaskBase(taskid), 0));
    }
    @Override
    public void run(String... args) throws Exception {
    log.info("初始化延时队列");
    Executors.newSingleThreadExecutor().execute(new Thread(this::excuteThread));
    }
    /**
    * 延时任务执行线程
    */
    private void excuteThread() {
    while (true) {
    try {
    DelayTask task = delayQueue.take();
    processTask(task);
    } catch (InterruptedException e) {
    break;
    }
    }
    }
    /**
    * 内部执行延时任务
    * @param task
    */
    private void processTask(DelayTask task) {
    log.error("执行延时任务:{}-{}", task,task.getData().getIdentifier());
    ZTransaction transaction = transactionService.selectZTransactionByOrderId(task.getData().getIdentifier());
    if (transaction.getPayStatus() == 0){
    transaction.setPayStatus(3);
    transactionService.updateZTransaction(transaction);
    }

    }
    }
    ==========================================================================================================================
    package com.xxx.zhugeyl.domain.Web;

    import com.alibaba.fastjson.JSON;

    public class TaskBase {

    private String identifier;

    public TaskBase(String identifier) {
    this.identifier = identifier;
    }

    public String getIdentifier() {
    return identifier;
    }

    public void setIdentifier(String identifier) {
    this.identifier = identifier;
    }

    @Override
    public String toString() {
    return JSON.toJSONString(this);
    }
    }
    ======================================================================================================================

    ZTransaction 是我自己的订单类

    使用的时候
    @Autowired
    private DelayQueueManager delayQueueManager;
    delayQueueManager.put(new DelayTask(new TaskBase(itrOrderId),1000*60*5));//新增任务

  • 相关阅读:
    LInq 与lambda表达式
    Java内存模型-jsr133规范介绍(转)
    Java多线程之Lock的使用(转)
    有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)
    CountDownLatch
    CyclicBarrier
    java设计模式演示样例
    2012毕业找工作记录点滴
    Objective-C语法之代码块(block)的使用
    权限表设计之代码解析
  • 原文地址:https://www.cnblogs.com/michaelcnblogs/p/15630839.html
Copyright © 2020-2023  润新知