我正在使用駱駝從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&waitForTaskToComplete=Never&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&waitForTaskToComplete=Never&purgeWhenStopping=true" />
<camel:transacted ref="propagationReqd" />
<camel:process ref="msgProcessor" />
<camel:to uri="{{final.queue}}" />
</camel:route>
感激,如果有人能指出我究竟做錯了什麼?
在此先感謝。
馬特,我必須使用SEDA,因爲定義了SLA來處理消息,但會考慮引入另一個Solace隊列來傳遞消息。 –