【问题标题】:Do not run Spring @Scheduled task on certain machine不要在某些机器上运行 Spring @Scheduled 任务
【发布时间】:2011-10-14 12:08:49
【问题描述】:
我们的 web 应用程序很少有计划任务,我们非常喜欢 Spring 的这个特性,很多人已经开始依赖它。我们有一台“试点”机器,它与生产机器共享相同的配置/数据库。由于这台机器指向与生产机器相同的数据库,因此当它运行计划任务时 - 它可能会影响生产数据。有没有办法不在这台机器上运行 Spring Scheduled 任务?我们想过依赖机器名,但不想在每次任务启动时都引入检查。有什么建议?
【问题讨论】:
标签:
java
spring
build-process
scheduled-tasks
【解决方案1】:
使用 Spring 3.1 Profiles 将非常容易,但您可以在 Spring 3.0 中做到这一点。
在您的上下文中:
<task:annotation-driven executor="taskExecutor" scheduler="configScheduler"/>
<task:scheduler id="taskScheduler"/>
<task:executor id="taskExecutor"/>
使用@Bean 定义configScheduler,如果设置了系统属性noScheduler,则使用虚拟调度程序。
@Configuration
public class SchedulerConfig {
@Resource(name="taskScheduler")
ThreadPoolTaskScheduler taskScheduler;
@Bean
ThreadPoolTaskScheduler configScheduler() {
ThreadPoolTaskScheduler scheduler =
System.getProperty("noScheduler") == null : taskScheduler ?
new ThreadPoolTaskScheduler() {
@Override public ScheduledFuture schedule(Runnable task, Trigger trigger) { return null; } // Cron
@Override public ScheduledFuture scheduleAtFixedRate(Runnable task, long period) { return null; }
@Override public ScheduledFuture scheduleWithFixedDelay(Runnable task, long delay) { return null; }
};
return scheduler;
}
}
【解决方案2】:
在 Spring 3.1 中,您将获得 profiles,这可能会对您有所帮助。