0

JMS/Datasource 是完整的 XA 2PC,由 Weblogic JTA 事务管理器管理。

  1. 消息监听器是没有事务注解的……(但好像可以参与事务,可能是因为JMS容器的定义吧?)
  2. 如果从 ServiceB 抛出任何未经检查的异常,事务会回滚并将消息放回 JMS 队列吗?
  3. 例外是在 serviceA 中捕获并记录下来,并且 dao.update(res) 正在新事务中发生,因此无论在 ServiceB 中的结果如何,它都会始终执行。
  4. 如果 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/>
4

0 回答 0