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