Jboss Cluster-方法中的调度程序被调用两次

时间:2012-12-21 09:24:34

标签: spring jboss

我们正在使用: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个节点)中运行,并且每个节点都调用此方法。我们怎么能避免这种情况?

或者它更像春天的虫子?

1 个答案:

答案 0 :(得分:1)

Spring应该如何知道你在集群中运行?不,这不是Spring的错误。

无论如何,你想要的是什么?您是否希望仅在一个节点上运行调度程序?或者除了一项任务外,只应该执行一次?

如果是第一个,则需要通过除一个节点以外的所有配置来禁用调度程序(或单个任务)。

出于故障安全原因,我们更倾向于在每个节点上运行调度程序。我们使用(单个)数据库来同步任务。您需要一些聪明的锁定机制,但基本上在任务运行之前,它会查询数据库以查明其中一个兄弟姐妹是否已经在运行。如果没有,它会将状态“running”写入数据库,并在完成后清除它。