我可以使用属性设置关闭石英调度程序吗?

时间:2011-10-19 09:01:17

标签: spring quartz-scheduler

我们通过在jobs.xml文件中注释掉shceduler工厂bean来本地禁用quartz调度程序。是否有在quartz.properties文件中执行类似操作的设置?

7 个答案:

答案 0 :(得分:10)

如果您使用Spring Framework,您可以从org.springframework.scheduling.quartz.SchedulerFactoryBean创建子类并覆盖afterPropertiesSet()方法。

public class MySchedulerFactoryBean extends org.springframework.scheduling.quartz.SchedulerFactoryBean {

    @Autowired
    private @Value("${enable.quartz.tasks}") boolean enableQuartzTasks;

    @Override
    public void afterPropertiesSet() throws Exception {
        if (enableQuartzTasks) {
            super.afterPropertiesSet();
        } 
    }
}

然后在xml文件中更改工厂声明,并在属性文件中设置“enable.quartz.tasks”属性。就这样。

当然,使用@Autowired可以编写并使用setter方法并添加

<property name="enableQuartzTasks" value="${enable.quartz.tasks}"/>

到xml中的MySchedulerFactoryBean声明。

答案 1 :(得分:4)

如果使用Spring Framework 3.1创建和启动它,则可以禁用Quartz Scheduler。 在我的Spring配置文件中,我以这种方式使用Spring 3.1的新配置文件功能:

<beans profile="production,test">
    <bean name="bookingIndexerJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.xxx.indexer.scheduler.job.BookingIndexerJob" />
        <property name="jobDataAsMap">
            <map>
                <entry key="timeout" value="10" />
            </map>
        </property>
    </bean>

    <bean id="indexerSchedulerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="bookingIndexerJob" />
        <property name="startDelay" value="1000" />
        <property name="repeatInterval" value="5000" />
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="indexerSchedulerTrigger" />
            </list>
        </property>
        <property name="dataSource" ref="ds_quartz-scheduler"></property>
        <property name="configLocation" value="classpath:quartz.properties" />
        <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    </bean>
</beans>

只有当我想启动调度程序时(例如在生产环境中),我才会设置'spring.profiles.active'系统属性,以及活动配置文件列表:

-Dspring.profiles.active = “生产”

更多信息:

http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/

http://java.dzone.com/articles/spring-profiles-or-not

答案 2 :(得分:3)

没有。但属性文件无法启动调度程序。

除非某些代码调用scheduler.start(),否则调度程序不会启动。

答案 3 :(得分:2)

似乎autoStartup中有属性org.springframework.scheduling.quartz.SchedulerFactoryBean,因此您可以在xml配置中对其进行配置,如下所示:

<bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="autoStartup" value="${cron.enabled}"/> <property name="triggers"> <list> <ref bean="someTriggerName"/> </list> </property> </bean>

感谢https://chrisrng.svbtle.com/configure-spring-to-turn-quartz-scheduler-onoff

答案 4 :(得分:2)

我个人喜欢Demis Gallisto的回答。如果您可以使用个人资料,这将是我的建议。

如今,人们更倾向于使用Annotations,这是对他答案的补充。

@Configuration
@Profile({ "test", "prod" })
public class SchedulerConfig {
  @Bean
  // ... some beans to setup your scheduler
}

仅当配置文件testprod处于活动状态时,才会触发调度程序。因此,如果您设置不同的个人资料,例如-Dspring.profiles.active=dev什么都不会发生。

如果由于某些原因您无法使用配置文件方法,例如个人资料重叠...

来自miso.belica的解决方案似乎也有效。

定义属性。例如在application.propertiesdailyRecalculationJob.cron.enabled=false中,并在SchedulerConfig中使用它。

@Configuration
public class SchedulerConfig {
  @Value("${dailyRecalculationJob.cron.enabled}")
  private boolean dailyRecalculationJobCronEnabled;

  @Bean
  public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, Trigger trigger) throws 
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setAutoStartup(dailyRecalculationJobCronEnabled);
    // ...
    return factory;
  }
  // ... the rest of your beans to setup your scheduler
}

答案 5 :(得分:1)

我有类似的问题:在测试范围内禁用调度程序。 这是我的applicationContext.xml

的一部分
<task:annotation-driven scheduler="myScheduler" />
<task:scheduler id="myScheduler" pool-size="10" />

我已经使用'primary'属性和Mockito禁用了调度程序。这是我的applicationContext-test.xml

<bean id="myScheduler" class="org.mockito.Mockito" factory-method="mock" primary="true">
     <constructor-arg value="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"/>
</bean>

希望这有帮助!

答案 6 :(得分:1)

在Spring Boot上下文中进行测试的最简单方法是: @MockBean Scheduler scheduler;