春季交易传播

时间:2013-03-10 10:09:13

标签: spring transactions spring-transactions

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

  1. 消息监听器不是事务性注释的...(但似乎能够参与事务,可能是因为JMS容器的定义?)
  2. 如果从ServiceB抛出任何未经检查的异常,事务将被回滚并且消息将被放回JMS队列吗?
  3. 异常是捕获的serviceA,已记录且dao.update(res)在新事务中发生,因此无论ServiceB中的结果如何,它都将始终执行。
  4. 如果dao.update(res)失败,则所有内容都将获得支持滚动
  5. 有人可以证实上述情况吗?我的逻辑是正确的还是我错过了什么?

    请征求意见和建议。

    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/>
    

0 个答案:

没有答案