Camel In Action 读书笔记 (9)

第9章谈了事务在Camel中的应用。

第一节讲了一堆废话,为什么要用事务。在最后提到了一点jms在应用的时候consumer默认采取的是 auto-acknowledge mode(自动应答模式)即只要consumer接收了这个消息,jms服务器就认为消息已处理完成,无论consumer是否处理成功。当然jms还有另一种模式 transacted acknowledge mode(事务确认模式)。

第二节Transaction basics(事务基础),Camel本身不提供事务,Camel支持事务是依赖Spring的事务管理。后面是事务管理的一个例子,当然也就是上面说的transacted acknowledge mode。

配置事务管理器、jms服务器,如下:

<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>

注意上面标红的,jms服务器的事务开关要打开,同时注入spring的事务管理器。

定义路由如下:

<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>

路由中也要将事务开关打开。

前两节介绍了事务的基础,第三节又进入了老话题,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 完结。。。。。

你可能感兴趣的:(Camel In Action 读书笔记 (9))