我们有在数据库中配置的cron表达式的Spring调度作业。我需要在不重新启动应用程序服务器的情况下更改计划时间。但我无法做到这一点,我已经尝试了很多方法在其他环节使用SO解决方案,但没有一个适合我。下面是我的代码片段。
调度器时间将在调度器servlet初始化期间从数据库获取,并在属性变量test.scheduler
中分配Scheduler.java
@Scheduled(cron = "${test.scheduler}")
public void testScheduler() {
System.out.println("Dynamic Scheduler Run Test"+new java.util.Date().getTime());
}
dispatcher-servlet.xml
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="properties">
<bean class="org.apache.commons.configuration.ConfigurationConverter" factory-method="getProperties">
<constructor-arg>
<bean class="org.apache.commons.configuration.DatabaseConfiguration">
<constructor-arg>
<ref bean="dataSource" />
</constructor-arg>
<constructor-arg value="TABLE_NAME" />
<constructor-arg value="TABLE_KEY" />
<constructor-arg value="TABLE_VALUE" />
</bean>
</constructor-arg>
</bean>
</property>
</bean>
从表(TABLE_NAME)中,有一个列的键是test。调度程序,值为0/5 * * * ?
据我所知,一旦调度程序初始化,SpEL将不允许您更改调度程序的值。
如果你正在使用Spring Boot,你将能够使用Actuator来触发刷新事件:-
http://localhost:8080/actuator/refresh
在这种情况下,您可以让bean实现RefreshedScope
,并通过触发RefreshScopeRefreshedEvent
来更新您的调度程序:
@EventListener(RefreshScopeRefreshedEvent.class)
public void onRefresh(RefreshScopeRefreshedEvent event) {
// Read the database, update the scheduler.
}
可以在这里看到一个示例实现。这可能不是你问题的完美解决方案,但我把它贴出来是为了让别人看到,并帮助别人。
另一种解决方案可能涉及使用Trigger
来确定下一次执行时间。在这里可以看到一个StackOverflow答案的例子。