2012-05-04 35 views
2

我在POC其執行以下操作事務而使用消息驅動的通道適配器和服務激活

  1. 工作處理使用消息驅動通道適配器在交易
  2. 到收到消息調用服務活化劑,其使用處理程序將從適配器接收的消息插入數據庫,並將消息發佈到出站通道。

現在,如果消息的DB插入失敗,我希望JMS消息返回到隊列,以便稍後可以重新嘗試。

用我下面的配置它不似乎工作。(即,即使出現故障,而插入消息從隊列中刪除的數據庫。

任何指針或示例配置將是有益的。

<integration:channel id="jmsInChannel">   
    <integration:queue/> 
</integration:channel> 

<int-jms:message-driven-channel-adapter id="jmsIn" 
    transaction-manager="transactionManager" 
    connection-factory="sConnectionFactory" 
    destination-name="emsQueue" 
    acknowledge="client" channel="jmsInChannel" 
    extract-payload="false"/> 

<integration:service-activator input-channel="jmsInChannel" 
    output-channel="fileNamesChannel" ref="handler" method="process" /> 

<bean id="handler" class="com.irebalpoc.integration.MessageProcessor"> 
    <property name="jobHashTable" ref="jobsMapping" /> 
</bean> 

回答

5

組應答信號=「交易」和我猜想的transactionManager的是JDBC(或者JTA)事務管理。

您還需要從JmsInChannel刪除<隊列/ >以便數據庫事務發生在同一個線程上。

Spring將使數據庫事務與JMS事務同步。

但是,請閱讀http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html

如果您不能使您的服務冪等,您可能需要查看一個XA事務管理器。

+0

我不相信你需要(甚至可以)*刪除* JmsInChannel - 但你確實需要從中刪除*隊列*。你需要一個DirectChannel(默認),它在同一個線程上作爲方法調用實現,因此它的輸出處理程序將在任何打開的事務中執行。 @加里羅素 - 感謝您的鏈接,這對我非常有幫助。 –

+0

@Gary Russell - 有沒有辦法在消息驅動通道適配器中設置重試時間?我試過'recovery-interval =「20000」'但是不起作用 – shashikanthb

+0

我剛剛編輯了我的評論;我已經指定但沒有轉義字符,所以html吃了單詞隊列。 –

相關問題