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