我们通过在jobs.xml文件中注释掉shceduler工厂bean来本地禁用quartz调度程序。是否有在quartz.properties文件中执行类似操作的设置?
答案 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/
答案 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
}
仅当配置文件test
或prod
处于活动状态时,才会触发调度程序。因此,如果您设置不同的个人资料,例如-Dspring.profiles.active=dev
什么都不会发生。
如果由于某些原因您无法使用配置文件方法,例如个人资料重叠...
来自miso.belica的解决方案似乎也有效。
定义属性。例如在application.properties
:dailyRecalculationJob.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;