zoukankan      html  css  js  c++  java
  • Quartz总结(四):动态修改定时器二

    前文:http://www.cnblogs.com/LiuChunfu/p/5598806.html 提到了一种动态修改定时器的方法,

    其本质就是在job方法中注入Schedular的对象,从Schedular中获取Trigger(触发器),然后修改触发器的条件,重新启动。

    前文中的方法,其实已经涉及到了循环调用。

    Job类 => Job => Trigger => Schedular =>Job类。

    这样是很容易发生问题的,也确实在实际项目中发生了问题,特别是当Schedular中有多个trigger的时候,注入实际的Job工作类时候报错了,产生的原因应该就是因为循环调用的问题。

    方法2:

    既然我们已经通过在Srping的Bean的XML文件中配置了SchedulerFactory产生的Bean,那么完全可以在实际的Job中通过@Resource或者@Autowired注入,再仔细一思考,仍然不对啊,这个和方法一的循环调用一样,会出现问题(实际也是)。

    此时处理办法是:懒加载Schdular的类,用到的时候才加载。

    代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 要执行任务的任务类。 -->
        <bean id="testQuartz" class="com.mc.bsframe.job.TestJob"></bean>
    
        <!-- 将需要执行的定时任务注入JOB中。 -->
        <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="testQuartz"></property>
            <!-- 任务类中需要执行的方法 -->
            <property name="targetMethod" value="doSomething"></property>
            <!-- 上一次未执行完成的,要等待有再执行。 -->
            <property name="concurrent" value="false"></property>
        </bean>
    
        <!-- 基本的定时器,会绑定具体的任务。 -->
        <bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
            <property name="jobDetail" ref="testJob"></property>
            <property name="startDelay" value="3000"></property>
            <property name="repeatInterval" value="200000"></property>
        </bean>
    
        <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="testTrigger"></ref>
                </list>
            </property>
        </bean>
    </beans>

    Java代码:

    public class TestJob {
    
        @Autowired
        private TestService testSevice;
    
        public void doSomething() {
            testSevice.sayHi();
            System.err.println("****:" + TimeUtils.getCurrentTime());
        }
    
        @Autowired
        @Qualifier("scheduler")
      @Lazy
    private Scheduler scheduler; /** * 重置定时任务 * @Title: restJob * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param time * @param @throws Exception * @return void 返回类型 * @throws */ public void restJob(long time) throws Exception { TriggerKey triggerKey = new TriggerKey("testTrigger", Scheduler.DEFAULT_GROUP); SimpleTriggerImpl simpleTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerKey); simpleTrigger.setRepeatInterval(time); scheduler.rescheduleJob(triggerKey, simpleTrigger); } }
  • 相关阅读:
    九度OJ题目1137:浮点数加法 (JAVA)使用BigDecimal四个案例都通过了,但是超时了。
    九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换
    九度OJ题目1076:N的阶乘 (java)运用BigInteger的例子。
    九度OJ题目1443:Tr A (JAVA)
    九度oj题目1207:质因数的个数
    pg 比mysql 强的数据库
    mysql8 sql_mode=only_full_group_by问题解决
    mysql 8.0.19 安装
    springboot + mybatis plus强大的条件构造器queryWrapper、updateWrappe
    Elasticsearch 学习
  • 原文地址:https://www.cnblogs.com/LiuChunfu/p/5605253.html
Copyright © 2011-2022 走看看