Spring之定时器(QuartzJobBean)的实现

本文介绍了一个基于Quartz的任务提醒模块的设计与实现过程。该模块能在任务截止前15分钟通过邮件、短信等方式进行提醒,并每5分钟重复提醒直至任务完成。

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

需求:做个分配任务的功能模块,在任务截止前的十五分钟进行提醒(发送邮件、短信、系统提醒)。每隔五分钟提醒一次,直到任务完成!

想法:刚开始是想着是不是可以做个监听器,监听截止时间。当时间到了开始进行定时任务(尴尬,经验不足的臆测)。可不怎么好实现。。。。后来只能换个思路,

   做个定时器,每五分钟执行一次,查出所有的任务截止时间,与当前时间比较,到十五分钟了进行提醒。。。。。听着好low啊,要不停的查询数据库。先只能暂时这样做着了。。

撸码:


1、pom文件:
    <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
     </dependency>
2、需要建个job的java类,继承  QuartzJobBean
public class MissionInformJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        try {
            getMissionInform();
        } catch (Exception e) {
            logger.error("MissionInformJob ExecuteInternal MessagingException:" + e);
        }
    }
    
     public void getMissionInform (){}
        
  }

在方法里写要定时执行代码;

3、配置文件

<!-- 要调用的工作类 -->
 <bean id="missionJob" class="com.ceair.bcc.message.job.MissionInformJob"></bean>
  
  <!-- 任务配置列表 -->
  <bean id="missionTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <!-- 调用的类 -->
          <property name="targetObject">
              <ref bean="missionJob" />
          </property>
         <!-- 调用类中的方法 -->
         <property name="targetMethod">
             <value>getMissionInform</value>
         </property>
         <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
         <property name="concurrent" value="true"/>
     </bean>
 
 <!-- 触发器配置  时间指定 -->
 <bean id="missionCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
         <property name="jobDetail" ref="messageTask"></property>
         <!-- cron表达式 -->
         <property name="cronExpression">
             <!-- 每隔5分钟执行一次-->
             <!--<value>0/30 * * * * ?</value>-->
             <value>0 0/5 * * * ?</value>
         </property>
     </bean>
 
 
 <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
     <bean id="startQuertz" lazy-init="false" autowire="no"
           class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
             <list>
                 <!-- 触发器列表    -->
                 <!--<ref bean="msgCronTrigger" />-->
                 <!--<ref bean="emailCronTrigger" />-->
                 <ref bean="excessCronTrigger"/>
                 <ref bean="missionCronTrigger"/>
             </list>
         </property>
     </bean>

虽然这样就写完了 但是还有很多疑问,,因为在网上也查了资料,很遗憾没有找到自己要的答案。

疑问:1、网上有的大神说  继承了QuartzJobBean类 就不需要再配置文件了,,,

         2、org.springframework.scheduling.quartz.CronTriggerFactoryBean  和org.springframework.scheduling.quartz.SimpleTriggerBean的区别
点击打开链接 这篇里写:

        * 任务调度的触发时机来分,主要有以下两种:

      1.每隔指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.SimpleTriggerBean

      2.每到指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.CronTriggerBean

      注:这两种触发方式均可以跟两种作业继承方式相互组合来使用。
点击打开链接  这里写:
        A:简单触发器,使用 SimpleTriggerFactoryBean
      你可以定义作业的启动时间、触发器之间的延迟时间以及 repeatInterval(频率)。

<!-- Run the job every 2 seconds with initial delay of 1 second -->  
 <bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
     <property name="jobDetail" ref="simpleJobDetail" />  
     <property name="startDelay" value="1000" />  
     <property name="repeatInterval" value="2000" />  
        B:计划触发器,使用 CronTriggerFactoryBean
      这种类型更加灵活,允许你针对特定实例选择计划方案以及将来要执行的频率。
 <!-- Run the job every 5 seconds -->  
 <bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
     <property name="jobDetail" ref="firstComplexJobDetail" />  
     <!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->  
     <property name="cronExpression" value="0/5 * * ? * *" />  
做下记录,后期再进行深究和修正。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值