0

JMS/データソースは完全な 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