2016-10-06 117 views
0

我正在使用駱駝從Solace隊列下載消息,並且難以理解事務管理。Apache駱駝事務:直接傳輸不支持事務會話

流是這樣的,消息從Solace隊列下載,然後根據某些邏輯推送到許多Solace隊列中的一個(稱爲分級)。從這些分段隊列中,使用SEDA組件將消息路由到處理器(bean),最後將其發送到另一個Solace隊列。作爲

<bean id="propagationReqd" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> 
     <property name="transactionManager" ref="jmsTransactionManager" /> 
     <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" /> 
</bean> 

消息被保持在in.solace.queue如果異常是由提出,但如果消息已經被從隊列暫存到SEDA傳遞它丟失

我已配置事務到msgProcessor bean並拋出以下異常。

無法創建JMS事務;嵌套異常com.solacesystems.jms.ConfigurationException:成交會話或XA會話不直接支持運輸

我的理解是它發生,因爲SEDA不是一個物理隊列時異常被拋出,但我因此消息丟失思想階段安全隊列將保留它。

路由配置

<camel:route id="msg.router"> 
    <camel:from uri="{{in.solace.queue}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="direct:msgSequencer" /> 
</camel:route> 

<camel:route id="msg.processor"> 
    <camel:from uri="direct:msgSequencer" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="sequencer" /> 
    <camel:choice> 
     <camel:when> 
      <camel:simple>${headers.MsgId} == '0'</camel:simple> 
      <camel:to uri="{{stage.solace.queue.0}}" /> 
     </camel:when> 
     <camel:when> 
      <camel:simple>${headers.MsgId} == '1'</camel:simple> 
      <camel:to uri="{{stage.solace.queue.1}}" /> 
     </camel:when> 
     ... 
     ... 
     ... 
    </camel:choice> 
</camel:route> 

<camel:route id="msg.seda.0"> 
    <camel:from uri="{{stage.solace.queue.0}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="seda:processor.0" /> 
</camel:route> 

<camel:route id="msg.seda.1"> 
    <camel:from uri="{{stage.solace.queue.1}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="seda:processor.1" /> 
</camel:route> 

<camel:route id="msg.process.0"> 
    <camel:from uri="seda:processor.0?concurrentConsumers=4&amp;waitForTaskToComplete=Never&amp;purgeWhenStopping=true" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="msgProcessor" /> 
    <camel:to uri="{{final.queue}}" /> 
</camel:route> 

<camel:route id="msg.process.1"> 
    <camel:from uri="seda:processor.1?concurrentConsumers=4&amp;waitForTaskToComplete=Never&amp;purgeWhenStopping=true" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="msgProcessor" /> 
    <camel:to uri="{{final.queue}}" /> 
</camel:route> 

感激,如果有人能指出我究竟做錯了什麼?

在此先感謝。

回答

1
  1. 錯誤聽起來像是一個配置問題w/Solace設置連接工廠。

  2. 僅供參考seda端點不能在事務中計數b/c它們是異步的。

  3. 如果你真的需要交易的B/W的所有步驟,我把消息回到另一個慰藉隊列,而不是一個終點SEDA

+0

馬特,我必須使用SEDA,因爲定義了SLA來處理消息,但會考慮引入另一個Solace隊列來傳遞消息。 –

1

無法創建JMS事務;嵌套的例外是com.solacesystems.jms.ConfigurationException:成交會話或XA會話沒有直接TRANSPO RT支持

安慰不允許交易,使啓用直接傳輸使用JMS連接工廠。這是你例外的原因。

此處的解決方案是禁用您的msgProcessor bean使用的連接工廠的直接傳輸,以使事務擺脫此異常。

消息被保持在in.solace.queue如果異常是由定序器升高,但如果消息已經被從隊列暫存到SEDA到msgProcessor豆和以下拋出異常傳遞它丟失。

http://camel.apache.org/seda.html看來,SEDA似乎不支持恢復/事務。

如果VM在消息尚未處理時終止,則此組件不會執行任何類型的持久性或恢復, 。如果 需要持久性,可靠性或分佈式SEDA,請嘗試使用 JMS或ActiveMQ。

+0

,但如果** VM終止**,消息將不會被保留,而不是應用程序拋出一些異常。 –