0

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

或者它更像是春天的虫子?

4

1 回答 1

1

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

无论如何,你想要的行为是什么?你想让你的调度器只在一个节点上运行吗?或者除了一个任务之外的所有任务都应该只执行一次?

如果是第一个,那么您需要通过某种配置方式在除一个节点之外的所有节点上禁用调度程序(或单个任务)。

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

于 2012-12-21T10:05:06.273 回答