【发布时间】:2013-12-24 18:16:40
【问题描述】:
我们在 Oracle Weblogic 10.3.6 服务器中有 2 个节点的集群环境,它是 Round-Robin。
我有服务从外部系统获取消息并将它们放入数据库 (Oracle DB)。
我正在使用 jdbc-inbound-adapter 来转换这些消息并将其传递给通道。 并且只处理一次消息。我计划在 DB 表中有一个列(NODE_NAME)。当从外部系统获取消息的第一个服务也使用 NODE_NAME (weblogic.Name) 更新列时。在 jdbc-inbound-adapter 的 SELECT 查询中,如果我指定 NODE_NAME,那么消息将只处理一次。
即如果 Service1(Node1)将消息保存在 DB 中,则 inbound-adapter1(node1)将消息传递到通道。
Example:
<si-jdbc:inbound-channel-adapter id="jdbcInboundAdapter"
channel="queueChannel" data-source="myDataSource"
auto-startup="true"
query="SELECT * FROM STAGE_TABLE WHERE STATUS='WAITING' and NODE_NAME = '${weblogic.Name}'"
update="UPDATE STAGE_TABLE SET STATUS='IN_PROGRESS' WHERE ID IN (:Id)"
max-rows-per-poll="100" row-mapper="rowMapper"
update-per-row="true">
<si:poller fixed-rate="5000">
<si:advice-chain>
<ref bean="txAdvice"/>
<ref bean="inboundAdapterConfiguration"/>
</si:advice-chain>
</si:poller>
</si-jdbc:inbound-channel-adapter>
这是一个好的设计吗?
第二种方法:在 jdbc-inbound-adapter 中使用下面的 Select SQL,但我猜这会失败,因为我使用的是 Oracle 数据库。
SELECT * FROM TABLE WHERE STATUS='WAITING' FOR UPDATE SKIP LOCKED
如果有人能指出我正确的方向,那就太好了。
【问题讨论】:
-
其实
FOR UPDATE SKIP LOCKED正是Oracle的特性——asktom.oracle.com/pls/asktom/…。 -
然后我可以继续使用这个 Select SQL。我遇到了这篇文章,但我不确定用户是否面临任何挑战,因为从他的回复中不清楚:link
-
如果您有疑问,这里是 Spring Integration 的代码:github.com/spring-projects/spring-integration/blob/master/…,我们使用相同的语句