后台-系统设置-扩展变量-手机广告位-内容正文顶部 |
定时任务机制说明
架构说明
全新的定时任务不再面向xxl-job开发,而是面向mq开发。
通过xxl-job解决多节点定时任务重复执行问题,开发过程中只需要一个xxl-job任务入口,然后对需要执行的任务发送mq,即可实现定时任务。
类图
*jobHandler为xxl-job对接的,分别对应执行的任务
*Execute为任务接口,分别代表每小时/每天/每月/每年任务,继承接口,即可在特定时间进行调用
JobAmqpExchange为定时任务的AMQP消息静态常量,定时任务触发为发送消息,交给具体的消息处理去完成任务
OrderStatusChangeJobReceiver为定时任务接口的实现类。
由于类图关联关系不是很紧密,这里表明一个示例:
OrderStatusCheckJob实现各个任务接口,来完成定时任务的调用。
Every*ExecuteJobHandler为xxl-job的核心类的继承,继承这个类,且加入对应的注解,才可以与xxl-job对接。
流程图
1、xxl-job定时任务触发,调用javashop中的任务
2、调用xxl任务类,发送AMQP消息
3、AMQP消费者监听消息
4、具体业务在AMQP消费监听中循环调用接口的实现类(这里为EveryDayExecute)
5、业务进行处理,修改数据库或者缓存等
部署
需要配置文件application.yml进行配置
xxl:
job:
admin:
addresses:http://127.0.0.1:8080/xxl-job-admin
executor:
appname:timing-job-execute
ip:
port:6999
logpath:/Users/chopper/log
logretentiondays:-1
accessToken:
需要修改内容:
xxl.job.admin.address===>调用地址
xxl.job.executor.logpath===>日志路径
开发
消息静态常量
进行AMQP消息常量等设置,新增定时任务,把这里的常量进行增加
packagecom.enation.app.javashop.job;
/**
*定时任务AMQP消息定义
*
*@authorkingapex
*@version1.0
*@since6.4
*2017-08-1718:00
*/
publicclassJobAmqpExchange{
/**
*每小时执行
*/
publicfinalstaticStringEVERY_HOUR_EXECUTE="EVERY_HOUR_EXECUTE";
/**
*每日执行
*/
publicfinalstaticStringEVERY_DAY_EXECUTE="EVERY_DAY_EXECUTE";
/**
*每月执行
*/
publicfinalstaticStringEVERY_MONTH_EXECUTE="EVERY_MONTH_EXECUTE";
/**
*每年执行
*/
publicfinalstaticStringEVERY_YEAR_EXECUTE="EVERY_YEAR_EXECUTE";
}
任务接口
Every***Execute为任务接口,示例代码如下,实现接口,注入spring即可
/**
*每日执行
*
*@authorliushuai
*@versionv1.0
*@sincev7.0
*2018-07-06上午4:24
*/
@JobHandler(value="everyDayExecuteJobHandler")
@Component
publicclassEveryDayExecuteJobHandlerextendsIJobHandler{
protectedfinalLoglogger=LogFactory.getLog(this.getClass());
@Autowired
privateAmqpTemplateamqpTemplate;
@Override
publicReturnT
try{
amqpTemplate.convertAndSend(JobAmqpExchange.EVERY_DAY_EXECUTE,
JobAmqpExchange.EVERY_DAY_EXECUTE+"_ROUTING",
"");
}catch(Exceptione){
this.logger.error("每日任务AMQP消息发送异常:",e);
returnReturnT.FAIL;
}
returnReturnT.SUCCESS;
}
}
消费者
示例代码
packagecom.enation.app.javashop.consumer.core.receiver;
importcom.enation.app.javashop.consumer.job.execute.EveryDayExecute;
importcom.enation.app.javashop.core.base.JobAmqpExchange;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.springframework.amqp.core.ExchangeTypes;
importorg.springframework.amqp.rabbit.annotation.Exchange;
importorg.springframework.amqp.rabbit.annotation.Queue;
importorg.springframework.amqp.rabbit.annotation.QueueBinding;
importorg.springframework.amqp.rabbit.annotation.RabbitListener;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjava.util.List;
/**
*每日执行调用
*
*@authorChopper
*@versionv1.0
*@sincev7.0
*2018-07-25上午8:26
*/
@Component
publicclassEveryDayExecuteReceiver{
protectedfinalLoglogger=LogFactory.getLog(this.getClass());
@Autowired
privateList
@RabbitListener(bindings=@QueueBinding(
value=@Queue(value=JobAmqpExchange.EVERY_DAY_EXECUTE+"_QUEUE"),
exchange=@Exchange(value=JobAmqpExchange.EVERY_DAY_EXECUTE,type=ExchangeTypes.FANOUT)
))
publicvoideveryDay(){
for(EveryDayExecuteeveryDayExecute:everyDayExecutes){
try{
everyDayExecute.everyDay();
}catch(Exceptione){
logger.error("每日任务异常:",e);
}
}
}
}
业务实现
packagecom.enation.app.javashop.consumer.job.execute.impl;
importcom.enation.app.javashop.core.base.JobAmqpExchange;
importcom.enation.app.javashop.consumer.job.execute.EveryDayExecute;
importcom.enation.app.javashop.core.trade.order.service.OrderTaskManager;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.springframework.amqp.core.ExchangeTypes;
importorg.springframework.amqp.rabbit.annotation.Exchange;
importorg.springframework.amqp.rabbit.annotation.Queue;
importorg.springframework.amqp.rabbit.annotation.QueueBinding;
importorg.springframework.amqp.rabbit.annotation.RabbitListener;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
/**
*订单状态扫描
*
*@authorchopper
*@versionv1.0
*@sincev7.0
*2018-07-05下午2:11
*/
@Component
publicclassOrderStatusCheckJobimplementsEveryDayExecute{
protectedfinalLoglogger=LogFactory.getLog(this.getClass());
@Autowired
privateOrderTaskManagerorderTaskManager;
/**
*每晚23:30执行
*/
@Override
publicvoideveryDay(){
/**自动取消*/
try{
//款到发货,新订单24小时未付款要自动取消
this.orderTaskManager.cancelTask();
}catch(Exceptione){
logger.error("自动取消出错",e);
}
/**自动确认收货*/
try{
//发货之后10天要自动确认收货
this.orderTaskManager.rogTask();
}catch(Exceptione){
logger.error("自动确认收货出错",e);
}
/**自动完成天数*/
try{
//确认收货7天后标记为完成
this.orderTaskManager.completeTask();
}catch(Exceptione){
logger.error("订单7天后标记为完成出错",e);
}
/**自动支付天数*/
try{
this.orderTaskManager.payTask();
}catch(Exceptione){
logger.error("订单自动支付完成出错",e);
}
/**售后失效天数*/
try{
//完成后一个月没有申请售后,标记为售后过期
this.orderTaskManager.serviceTask();
}catch(Exceptione){
logger.error("订单标记为售后过期出错",e);
}
try{
//超过14天不能评价
this.orderTaskManager.commentTask();
}catch(Exceptione){
logger.error("订单超过14天不能评价出错",e);
}
}
}
代码命名规范及存放位置
根据以上内容可以了解到定时任务一些相关的内容,想了解更多详情,可以持续关注易族智汇javashop。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。