2016-04-25 59 views
2

我有一个消息驱动的通道适配器配置为从确认设置为事务的队列中选择消息。是否有可能发送不同的消息到下游的不同队列中,持有相同的事务也在数据库之间插入数据流?如果消息传递失败到任何队列,事务必须回滚(包括数据库条目)以及消息发送到其他队列。int-jms:消息驱动通道适配器和确认=“事务”

实施例:队列(接收)---> Db的插入 - >发送至(队列1,队列2 ...等发送不同的消息给每个队列)

如果任何发送调用用于队列1失败,队列2等的交易应回滚..

我能够做单队列配置(即只有队列1)。但如果涉及多个队列并保持事务边界,该怎么办。

由于 研究Vaidya

下面是配置

               <int-jms:message-driven-channel-adapter 
    id="MessageDrivenAdapter" channel="injmsChannel" destination="testQ" 
    concurrent-consumers="5" max-concurrent-consumers="10" acknowledge="transacted" 
    error-channel="Error" /> 

<int:channel id="injmsChannel" /> 

<int:chain input-channel="injmsChannel" id="Chain1"> 


    <int-jpa:retrieving-outbound-gateway 
     entity-class="entity.TestTable8" 
     entity-manager-factory="entityManagerFactory" id-expression="payload.getSno()"> 
     <int-jpa:transactional transaction-manager="transactionManager" /> 
    </int-jpa:retrieving-outbound-gateway> 

    <int:recipient-list-router id="ROUTE_1_2"> 
     <int:recipient channel="SuccessChannel" 
      selector-expression="payload.getSno()==1" /> 
      /> --> 
    </int:recipient-list-router> 

</int:chain> 

<int:channel id="SuccessChannel" /> 


<int:chain id="MessageProcessingChain" input-channel="SuccessChannel" 
    output-channel="putMsgChannel"> 

    <int:service-activator id="a1" ref="taskexe" 
     method="processTable8_1" requires-reply="true" /> 

    <int-jpa:retrieving-outbound-gateway 
     id="table7" entity-class="entity.TestTable7" 
     entity-manager-factory="entityManagerFactory" id-expression="payload.getSno()"> 
     <int-jpa:transactional transaction-manager="transactionManager" /> 
    </int-jpa:retrieving-outbound-gateway> 

    <int:service-activator id="a2" ref="taskexe" 
     method="processTable8_2" requires-reply="true" /> 

    <int-jpa:updating-outbound-gateway 
     id="table6" entity-class="entity.TestTable6" 
     entity-manager-factory="entityManagerFactory" flush="true"> 
     <int-jpa:transactional transaction-manager="transactionManager" /> 
    </int-jpa:updating-outbound-gateway> 

    <int:service-activator id="a3" ref="taskexe" 
     method="processTable6_1" requires-reply="true" /> 

    <int-jpa:updating-outbound-gateway 
     id="uptable6" entity-class="entity.TestTable6" 
     entity-manager-factory="entityManagerFactory" flush="true"> 
     <int-jpa:transactional transaction-manager="transactionManager" /> 
    </int-jpa:updating-outbound-gateway> 

    <int:service-activator id="a4" ref="taskexe" 
     method="processTable6_2" requires-reply="true" /> 



    <int-jpa:updating-outbound-gateway 
     id="uptable4" entity-class="entity.TestTable4" 
     entity-manager-factory="entityManagerFactory" flush="true"> 
     <int-jpa:transactional transaction-manager="transactionManager" /> 
    </int-jpa:updating-outbound-gateway> 



    <int:service-activator ref="taskexe" method="processTable4_1" 
     requires-reply="true" /> 



</int:chain> 

<int:channel id="putMsgChannel" /> 

<int-jms:outbound-channel-adapter id="sendsomemsg" 
    channel="putMsgChannel" connection-factory="connectionFactory" 
    session-transacted="true" destination-expression="headers['somequeue']" /> 

如何增加另一个INT-JMS:出站信道adapte用于具有消息驱动适配器的相同事务边界其他队列?此外flush = true已设置,以便消息不会传递到下游,如果有任何jpa适配器异常。

回答

1

只要队列发送使用JmsTemplate(包括使用JMS出站通道适配器)执行,就会在同一个线程上执行,它们将在与消息驱动适配器的消息传递相同的事务会话中执行。

如果将JDBC事务管理器添加到消息驱动的适配器中,则其事务将与JMS事务同步。

这提供了如在Dave Syer's JavaWorld article: Distributed transactions in Spring, with and without XA中讨论的“尽力而为1PC”。

数据库提交会成功并且JMS提交失败的可能性很小,因此您需要处理重复项。为了避免这种情况,您需要完整的XA解决方案。

+0

这里的版主不允许你编辑我的答案,关于你的问题的更多细节;你需要改变你的问题(并对我的回答发表评论,以便我收到通知)。但是,我可以看到您的编辑,并且它没有足够的信息来帮助您进一步 - 您需要显示* all *您的配置,包括消息驱动的适配器。 –

相关问题