第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,带事务的客户端模式:描述了一个客户端在处理消息的过程中是如何控制事务的。如下图:
带事务的客户端会挂起senssion直到确认这个消息处理完成。当Receiver开启事务时,消息在事务提交之前是不会发送或者删除的。当Sender开启事务时,消息在事务提交之前对consomer来说是不可用的。
下面讲两种具体的情况:
local transactions(单一资源管理)
如上图:事务管理器JmsTransactionManager只对jmsbroker进行管理,不对DB进行管理。
global transactions(多资源管理)
如上图:我们需要在一个事务中管理多个资源,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 完结。。。。。