我们正在使用:JBoss AS 7.1.1,Spring 3.1.0,Hibernate,..
我们有以下内容:
applicationContext.xml片段:
<task:scheduler id="taskScheduler" />
<task:executor id="taskExecutor" pool-size="10" />
<task:annotation-driven executor="taskExecutor"
scheduler="taskScheduler" />
方法:
import org.springframework.scheduling.annotation.Scheduled;
...
@Scheduled(cron = "0 0 0 1 * *")
public void reportMonthly() {
// do database stuff.
}
我们的问题是我们的Web应用程序在一个集群(2-4个节点)中运行,并且每个节点都调用此方法。我们怎么能避免这种情况?
或者它更像春天的虫子?
答案 0 :(得分:1)
Spring应该如何知道你在集群中运行?不,这不是Spring的错误。
无论如何,你想要的是什么?您是否希望仅在一个节点上运行调度程序?或者除了一项任务外,只应该执行一次?
如果是第一个,则需要通过除一个节点以外的所有配置来禁用调度程序(或单个任务)。
出于故障安全原因,我们更倾向于在每个节点上运行调度程序。我们使用(单个)数据库来同步任务。您需要一些聪明的锁定机制,但基本上在任务运行之前,它会查询数据库以查明其中一个兄弟姐妹是否已经在运行。如果没有,它会将状态“running”写入数据库,并在完成后清除它。