SpringBoot集成调用Quartz定时器

SpringBoot集成调用Quartz定时器

前言

https://blog.csdn.net/dongdingzhuo/article/details/97110642
在这篇文章的基础上,修改了其配置方式,将quartz.properties中的配置文件替换到yml中,并且不需要QuartzConfig.class

yml中配置

spring:
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 10000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
    #数据库方式
    job-store-type: jdbc
    #初始化表结构
    #jdbc:
      #initialize-schema: never

需要执行的任务

将其需要执行的任务替换为继承QuartzJobBean类,其中写自己需要的业务

import com.jds.core.utils.BaseUtil;
import com.swy.order.service.OrderService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.HashMap;
import java.util.Map;

public class OrderSettingJob extends QuartzJobBean {
    public static final String OrderSetting_ID = "orderSetting_id";
    public static final String OrderStatus = "orderStatus";
    public static final String OrderSetting_JOB_NAME = "orderSettingJob-";
    public static final String Source = "source";

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        final Long id = context.getMergedJobDataMap().getLong(OrderSetting_ID);
        final String orderStatus = context.getMergedJobDataMap().getString(OrderStatus);
        final String source = context.getMergedJobDataMap().getString(Source);
        OrderService orderService = (OrderService) BaseUtil.getService("orderService", OrderService.class);
        //业务处理
        if (!BaseUtil.isNullOrEmpty(orderService)) {
            Map order = new HashMap();
            order.put("id",id);
            order.put("orderStatus",orderStatus);
            order.put("source",source);
            orderService.txUpdateOrderStatusByJob(order);//在自己的接口实现类中实现定时器的具体执行
        }
    }
}

添加定时任务

因为我要在多个地方添加定时器,所以在自己的实现类中封装一个添加定时器任务的方法

/**
now 当前时间
goodsOrderId 订单id
type 订单设置中的自己建立的订单类型,根据这个去数据库查询订单设置的时间,列如,订单超过2分钟未支付则自动取消订单
status 订单即将成为的状态
source 根据它分辩是商品订单还是服务订单
..参数都是我自定义的
*/
private void addOrderJob(Date now, String goodsOrderId, String type, String status,String source) {
        Map getTime = new HashMap<>();
        getTime.put("name",type);
        getTime.put("appId",AppIdContextHolder.get());
        Map setting = db().selectOne("orderSetting.getSettingTime", getTime);
        if(setting!=null&&(!BaseUtil.isNullOrEmpty(setting.get("value")))){
            Integer value = ConvertUtil.parseInt(setting.get("value"));
            String unit = setting.get("unit").toString();
            Date date = null;
            if("min".equals(unit)){
                date = DateUtil.addMinutes(now, value);
            }else if("hour".equals(unit)){
                date = DateUtil.addHours(now,value);
            }else if("day".equals(unit)){
                date = DateUtil.addDays(now,value);
            }
            Map param = new HashMap<>();//执行定时器任务时需要获取的参数
            param.put(OrderSettingJob.OrderSetting_ID,goodsOrderId);
            param.put(OrderSettingJob.OrderStatus,status);
            param.put(OrderSettingJob.Source,source);
            quartzService.addJob(OrderSettingJob.class,OrderSettingJob.OrderSetting_JOB_NAME+UUID.randomUUID(),
                    "order",getCronStr(date),param);//添加定时器任务
        }
    }

    private String getCronStr(Date time) {
        Calendar calendar = DateUtil.calendar();
        calendar.setTime(time);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int second = calendar.get(Calendar.SECOND);
        int minute = calendar.get(Calendar.MINUTE);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int month = calendar.get(Calendar.MONTH) + 1;
        int year = calendar.get(Calendar.YEAR);
        return second + " " + minute + " " + hour + " " + day + " " + month + " ? " + year;
    }

在自己的实现类中只需要调用addOrderJob即可

//添加定时
addOrderJob(now,goodsOrderId,OrderSettingType.normal.toString(),OrderStatus.Cancelled.toString(),"goodsOrder");

定时器执行完任务时会自动删除该定时器

发布了7 篇原创文章 · 获赞 0 · 访问量 1668

猜你喜欢

转载自blog.csdn.net/qq_29307283/article/details/104048335
今日推荐