如何在运行时更改属性值而不重启Spring MVC中的应用程序服务器



我们有在数据库中配置的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答案的例子。

最新更新