第9章談了事務在Camel中的應用。spring
第一節講了一堆廢話,爲何要用事務。在最後提到了一點jms在應用的時候consumer默認採起的是 auto-acknowledge mode(自動應答模式)即只要consumer接收了這個消息,jms服務器就認爲消息已處理完成,不管consumer是否處理成功。固然jms還有另外一種模式 transacted acknowledge mode(事務確認模式)。apache
第二節Transaction basics(事務基礎),Camel自己不提供事務,Camel支持事務是依賴Spring的事務管理。後面是事務管理的一個例子,固然也就是上面說的transacted acknowledge mode。服務器
配置事務管理器、jms服務器,以下:tcp
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="transacted" value="true"/>
<property name="transactionManager" ref="txManager"/>
</bean>
<bean id="txManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>ui
注意上面標紅的,jms服務器的事務開關要打開,同時注入spring的事務管理器。.net
定義路由以下:component
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route id="partnerToDB">
<from uri="activemq:queue:partners"/>
<transacted/>
<bean ref="partner" method="toSql"/>
<to uri="jdbc:myDataSource"/>
</route>
</camelContext>xml
路由中也要將事務開關打開。接口
前兩節介紹了事務的基礎,第三節又進入了老話題,EIP。在這裏提出了一種新的模式:The Transactional Client EIP,帶事務的客戶端模式:描述了一個客戶端在處理消息的過程當中是如何控制事務的。以下圖:事務
帶事務的客戶端會掛起senssion直到確認這個消息處理完成。當Receiver開啓事務時,消息在事務提交以前是不會發送或者刪除的。當Sender開啓事務時,消息在事務提交以前對consomer來講是不可用的。
下面講兩種具體的狀況:
如上圖:事務管理器JmsTransactionManager只對jmsbroker進行管理,不對DB進行管理。
如上圖:咱們須要在一個事務中管理多個資源,JMS和JDBC都進行事務管理。在這種狀況下咱們事務管理器須要替換爲JtaTransactionManager。
實例可詳見:http://www.oschina.net/question/234345_51137
第4節主要講了事務傳播特性的配置,經過定義bean的形式,以下。
<bean id="required"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
<property name="propagationBehaviorName"
value="PROPAGATION_REQUIRED"/>
</bean>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route id="partnerToDB">
<from uri="activemq:queue:partners"/>
<transacted ref="required"/>
<bean ref="partner" method="toSql"/>
<to uri="jdbc:myDataSource"/>
</route>
</camelContext>
在這節還講了在多條路由中的事務控制狀況,具體詳見9.4.2.
第5節介紹了在事務管理中爭對不支持事務的資源如何處理。實現 方式是在UnitOfWork中註冊回調接口Synchronization
這個接口提供了兩個方法:
void onComplete(Exchange exchange);
void onFailure(Exchange exchange);
具體狀況再也不說明 。
Camel In Action 完結。。。。。