Camel In Action 讀書筆記 (9)

第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,帶事務的客戶端模式:描述了一個客戶端在處理消息的過程當中是如何控制事務的。以下圖:事務

image

 

帶事務的客戶端會掛起senssion直到確認這個消息處理完成。當Receiver開啓事務時,消息在事務提交以前是不會發送或者刪除的。當Sender開啓事務時,消息在事務提交以前對consomer來講是不可用的。

下面講兩種具體的狀況:

local transactions(單一資源管理)

 

image

 

如上圖:事務管理器JmsTransactionManager只對jmsbroker進行管理,不對DB進行管理。

global transactions(多資源管理)

image

如上圖:咱們須要在一個事務中管理多個資源,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 完結。。。。。

相關文章
相關標籤/搜索