我们在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
如果有人能指出我正确的方向,那就太好了。
答案 0 :(得分:0)
实际上,FOR UPDATE SKIP LOCKED
正是Oracle的功能 - https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2060739900346201280
如果您有疑问,请参阅Spring Integration中的代码:https://github.com/spring-projects/spring-integration/blob/master/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/store/channel/OracleChannelMessageStoreQueryProvider.java#L39