JMS/Datasource 是完整的 XA 2PC,由 Weblogic JTA 事务管理器管理。
- 消息监听器是没有事务注解的……(但好像可以参与事务,可能是因为JMS容器的定义吧?)
- 如果从 ServiceB 抛出任何未经检查的异常,事务会回滚并将消息放回 JMS 队列吗?
- 例外是在 serviceA 中捕获并记录下来,并且 dao.update(res) 正在新事务中发生,因此无论在 ServiceB 中的结果如何,它都会始终执行。
- 如果 dao.update(res) 失败,一切都会被回滚
有人可以确认上述内容吗?我的逻辑是正确的还是我错过了什么?
请提出意见和建议。
public class MyMessageListener
@Autowired
private ServiceA serviceA;
//I am not declaring this as a transcational.
public void onMessage(Message m) {
serviceA.methodA(m);
}
public class ServiceA {
@Autowired
private ServiceB serviceB;
@Autowired
private DAO dao;
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void methodA() {
try{
String res = ServiceB.methodB(m);
} catch (Exception e) {
log.(e);
}
dao.update(res);
}
public class ServiceB {
@Autowired
private DAO dao;
@Transactional
public void methodB(String m) {
dao.read()
callExtSystem() //this can throw unchecked exception
dao.insert()
}
public class DAO {
@Transactional
public read() {}
@Transactional
public insert(){}
@Transactional(propagation=Propagation.REQUIRES_NEW)
public update(){}
}
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener"/>
<property name="transactionManager" ref="transactionManager"/> //Weblogic JTA Manager
<property name="concurrentConsumers" value="10"/>
</bean>
<tx:jta-transaction-manager/>