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 完结。。。。。

相关文章
相关标签/搜索