定时任务详细说明

后台-系统设置-扩展变量-手机广告位-内容正文顶部

定时任务机制说明

架构说明

  全新的定时任务不再面向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

  publicReturnTexecute(Stringparam)throwsException{

  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

  privateListeveryDayExecutes;

  @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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

后台-系统设置-扩展变量-手机广告位-内容正文底部
留言与评论(共有 0 条评论)
   
验证码: