3

我在我的 Web 应用程序中使用 spring JDBC 入站通道适配器。如果我在集群环境中部署这个应用程序,两个或更多实例会拾取同一个作业并运行。任何人都可以通过更改弹簧配置来帮助克服这个问题吗?我附上了我的弹簧配置。

<int-jdbc:inbound-channel-adapter 
    query=" SELECT JOBID,
                   JOBKEY,
                   JOBPARAM                    
              FROM BATCHJOB 
             WHERE JOBSTATUS = 'A' "  
    max-rows-per-poll="1" channel="inboundAdhocJobTable" data-source="dataSource" 
    row-mapper="adhocJobMapper"
    update=" delete from BATCHJOB where JOBKEY in (:jobKey)"
     >
        <int:poller fixed-rate="1000" >
            <int:advice-chain>              
            </int:advice-chain>
        </int:poller>       

</int-jdbc:inbound-channel-adapter> 
4

1 回答 1

2

不幸的是,如果没有某种同步,这将是不可能的。此外,将数据库用作某种消息队列并不是一个好主意(http://mikehadlow.blogspot.de/2012/04/database-as-queue-anti-pattern.html)。我会尝试遵循不同的方法:

  1. 使用某种消息总线 + 消息存储来存储作业对象,而不是直接执行 SQL。在这种情况下,您必须更改作业的存储方式。通过使用某种消息存储支持的通道(仅限 Spring 集成)或将它们推送到 RabbitMQ 等消息队列来存储这些作业。
  2. 我不是 100% 确定,但请记住 Spring Batch 提供类似主从作业拆分和同步的功能。也许你在那里看看。
于 2013-08-23T07:37:34.020 回答