自定义简易定时器

完成定时器的三个对象:

   定时器对象:Scheduler;

   触发条件对象:Trigger;

   工作对象:JobDertail;

步骤如下:

第一步:导包

   <!-- quartz定时器 -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz-jobs</artifactId>
        <version>2.2.1</version>
    </dependency>

第二步:创建定时器对象Scheduler

Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();

第三步:创建工作对象JobDetail

JobDetail job=JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group").build();

第四步:创建触发条件对象:Trigger

触发条件对象分为简易条件对象和复杂条件对象;

简易条件对象就是根据秒数时间来触发执行操作,

复杂条件对象就是根据日历时间来触发执行操作。

对象 TriggerBuilder 启动任务时间
startNow 立即启动
startAt (Date) 指定时间启动

对象 SimpleScheduleBuilder 进行简单任务重复执行
repeatSecondly …() 多少秒后重复执行
repeatminutely …() 多少分钟后重复执行
repeatHourly …() 多少小时后重复执行

Trigger trigger=TriggerBuilder.newTrigger().withIdentity("trigger1", "group").startNow() .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(3)).build();

第五步:定时器业务执行

scheduler.scheduleJob(job, trigger);
scheduler.start();


一般我们整合Spring和Quartz使用

在applicationContext.xml中配置:

<!-- job 工作对象 -->
     <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <!-- 注意:此处需要的是工作类的类对象,即class.forName("PromotionJob") -->
            <!-- XX.getClass跟class.forName(XX)不一样 -->
            <!-- 必须用value,不可以用ref,JobDetail只支持和识别value -->
            <!-- value里面写工作类的全路径 -->
         <property name="jobClass" value="cn.itcast.bos.service.quartz.PromotionJob" />
     </bean>

<!-- simpleTrigger触发器 -->
    <bean id="simpleTrigger"
         class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
         <property name="jobDetail" ref="jobDetail" />
            <!-- 3秒后第一次执行 -->
         <property name="startDelay" value="3000" />
            <!-- 5秒后重复执行 -->
         <property name="repeatInterval" value="5000" />
     </bean> 


 <!-- cronTrigger触发器 -->
    <bean id="cronTrigger" class="org.quartz.CronTrigger">
        <property name="jobDetail" ref="jobDetail"></property>
            <!-- 每日6时触发 -->
            <!-- day-of-month 和 day-of-week 只能设置一个值,另一个值写 ? -->
        <property name="cronExpression" value="0 0 6 * * ?"></property>
    </bean>       

<!-- scheduler 定时器对象 -->
     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <!-- 当我们需要给工作类注入service类时,需要下面的jobFactory -->
         <property name="jobFactory" ref="jobFactory" />
         <property name="triggers">
             <list>
                <ref bean="cronTrigger"/>
                 <ref bean="simpleTrigger"/>
             </list>
         </property>
     </bean>

问题: 在 Job 中 spring 管理的 Bean 无法注入
解决: 需要在 Scheduler 中自定义 JobFactory

@Service("jobFactory")
    public class JobFactory extends AdaptableJobFactory {
        @Autowired
        private AutowireCapableBeanFactory capableBeanFactory;
        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle)
                throws Exception {
            Object jobInstance = super.createJobInstance(bundle);
            capableBeanFactory.autowireBean(jobInstance);
            return jobInstance;
        }
    }

注意:添加@Service注解是让工作类处于Spring的管理下

工作类,即需要定时执行的业务:PromotionJob



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值