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");
定时器执行完任务时会自动删除该定时器