群集模式下的Spring JDBC Adapter

时间:2013-08-23 02:34:22

标签: java spring spring-integration

我在我的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> 

1 个答案:

答案 0 :(得分:2)

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

  1. 使用某种消息总线+消息存储来存储作业对象,而不是直接执行SQL。在这种情况下,您将不得不更改作业的存储方式。通过使用某种消息存储支持的通道(仅限Spring集成)或将它们推送到像RabbitMQ这样的消息队列来存储这些作业。
  2. 我不是百分百肯定但是请记住Spring Batch提供类似Master-Slave-Job拆分和同步的东西。也许你看看那里。