Quartz动态改变Cron表达式,来实现动态执行Spring定时任务

本文介绍了如何使用Quartz定时器在不重启应用的情况下动态改变Cron表达式,从而实现Spring定时任务的动态执行。通过配置Spring的JobDetail和Trigger,并在项目启动时从数据库读取Cron表达式初始化Trigger。还提供了ISchedulerService接口及其实现类SchedulerServiceImpl,用于动态调度任务。最后展示了一个API示例,用于设置订单清理时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Quartz定时器非常强大,但是有时候我们想要不重就能动态的改变Cron表达式的值。

这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值。

每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。

 

一:定时调度任务

public classDailyScheduledJob extendsQuartzJobBean {

   // 开关(控制定时任务是否开启)

   private Boolean isOpen;

   privateApplicationContext context;

   private staticLogger logger= Logger.getLogger(DailyScheduledJob.class);

 

   protected voidexecuteInternal(JobExecutionContextcontext)throwsJobExecutionException{

     // 平台控制开关

      if (!isOpen) {

        return;

     }

      try {

        // 清理过期订单

        cleanSubs();

     } catch (Exception e) {

        logger.error("Daily线程清理过期订单出错!",e);

     }

   }

 

   /**

    *清理过期订单

   */

  public void cleanSubs() {

     try {

         ISubsService subsService =(ISubsService)context.getBean("subsService");

        subsService.cleanNoPayed();

     } catch (BeansException e) {

        logger.error("清理过期订单失败!");

     } catch (Exception ex) {

           logger.error("清理过期订单",ex);

       }

   }

  

   public void setContextUtil(ApplicationContextUtil contextUtil){

     this.context= contextUtil.getContext();

   }

  

   public void setIsOpen(Boolean isOpen) {

      this.isOpen= isOpen;

   }

}

 

二:spring配置

<beanid="dailyTask"

   class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

   <propertyname="jobClass"value="com.google.busi.schedule.DailyScheduledJob"/>

   <propertyname="durability"value="true"/>

   <propertyname="jobDataMap">

      <map>

         <entrykey="contextUtil"value-ref="applicationContextUtil"/>

        <!-- 定时任务执行开关 -->

        <entry key="isOpen"value="${googles.schedule.isopen}"/>

      </map>

   </property>

</bean>

<beanid="inquiryCronTrigger"class="com.google.busi.schedule.InitCronTriggerFactoryBean">

   <propertyname="jobDetail"ref="dailyTask"/>

   <!-- <property name="key"value="inquiryQuartzParam" /> -->

       <property name="baseConfigService"ref="baseConfigService"/>

</bean>

<beanid="schedulerFactoryBean"

   class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

   <propertyname="triggers">

      <list>

         <refbean="inquiryCronTrigger"/>

         <refbean="cronTrigger"/>

      </list>

   </property>

</bean>

 

三:项目启动时从数据库读取cron表达式,初始化Trigger

这里记得setName

/**

 *服务器启动时,从baseConfig读取配置文件配置的时间

 *@author Administrator

 *

 */

public classInitCronTriggerFactoryBean extendsCronTriggerFactoryBean implementsSerializable {

  

   //private static final longserialVersionUID = 1L;

   private static final long serialVersionUID= -5937544121329980033L;

  

   public static finalString SUBS_NOPAY_TRIGGER="SUBS_NOPAY_TRIGGER";

  

   privateIBaseConfigService baseConfigService;// =(IBaseConfigService)context.getBean("baseConfigService");

   /*private String key;

 

   public void setKey(String key) {

      this.key = key;

   }*/

 

   public void setBaseConfigService(IBaseConfigServicebaseConfigService) {

     this.baseConfigService=baseConfigService;

     setName(SUBS_NOPAY_TRIGGER);

     setCronExpression(getCronExpressionFromDB());

     System.out.println(SUBS_NOPAY_TRIGGER+ ":"+getCronExpressionFromDB());

   }

 

   private String getCronExpressionFromDB() { //从数据库拿到表达式

     StringsysParam =newString();

      returnDateUtil.parseExpression(Integer.valueOf(baseConfigService.loadBaseConfigByKey(Constants.NOPAY_SUBS_AGE).getConfigValue())/60);

   }

  

  

}

 

四:动态设置cron表达式的接口和实现类

接口

packagecom.google.busi.service.intf.busi;

 

importjava.util.Date;

 

importorg.quartz.CronExpression;

 

 

public interfaceISchedulerService {

    /**

     *根据 Quartz Cron Expression调试任务

    *

     *@param cronExpression

    *            Quartz Cron 表达式,如"0/10 * * ? * * *"

    */

   void schedule(String cronExpression);

 

    /**

     *根据 Quartz Cron Expression调试任务

    *

     *@param name

    *            Quartz CronTrigger名称

    * @param cronExpression

    *            Quartz Cron 表达式,如"0/10 * * ? * * *"

    */

   void schedule(String name,String cronExpression);

 

    /**

     *根据 Quartz Cron Expression调试任务

    *

     *@param name

    *            Quartz CronTrigger名称

    * @param group

    *            Quartz CronTrigger

     *@param cronExpression

    *            Quartz Cron 表达式,如"0/10 * * ? * * *"

    */

   void schedule

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值