Service Facade パターンを実装しようとしていますが、
さまざまな OAS のコンテナーにデプロイされている jar がいくつかあります。jar 内には、RMI を介して消費されるいくつかのメソッドを持つステートレス EJB 3.0 があり、それらのメソッドは Wars アプリから RMI を介して呼び出されます。
しかし、今では新しい要件があります.1つの戦争から、1つのトランザクション内の異なるコンテナーにある異なるjarファイルから3つのメソッドを呼び出す必要があり、あるjarのいくつかのメソッドが失敗した場合、すべてのメソッドでロールバックを行う必要があります。
例:
JAR A には、OAS コンテナ「OAS A」にデプロイされた EJB「A」があり、メソッド「A()」があります。
JAR Bには、OASコンテナ「OAS B」にデプロイされるEJB「B」があり、メソッド「B()」があります
JAR C には、OAS コンテナ「OAS C」にデプロイされる EJB「C」があり、メソッド「C()」があります。
WAR Z は、OAS コンテナーにデプロイされます "OAS Z" は、トランザクションでメソッド A() B() y C() を呼び出す必要があります。
War ファイルではトランザクションを管理できないため、ServiceFacade.jar という jar ファイルにある新しいアプリを作成し、OAS コンテナー「OAS SF」にデプロイされ、A() B を呼び出す EJB「SF」を持ちます。 () RMI を介した他の EJB の C()。
したがって、WAR Z は、3 つのメソッドを呼び出す serviceFacade メソッドを RMI 経由で呼び出し、すべて正常に動作します。
問題?
EJB SF 内では、 UserTransaction オブジェクトを使用して、次の方法でトランザクションを管理します。
@Stateless(name="SF")
@TransactionManagement(TransactionManagementType.BEAN)
@ApplicationException(rollback = true)
public class ServiceFacade ...
@Resource private UserTransaction userTx;
public void test() {
try {
userTx.begin();
getEJBA().A();
getEJBB().B();
getEJBC().C();
userTx.commit();
} catch (Exception e) {
try {
if (userTx != null &&
(userTx.getStatus() == Status.STATUS_ACTIVE ||
userTx.getStatus() == Status.STATUS_MARKED_ROLLBACK)) {
System.out.println("Rollback!!");
userTx.rollback();
}
} catch (SystemException ex) {
throw new SIGNOSException(SIGNOSException.DEFAULT_EXCEPTION,
ex.getMessage());
}
throw (SIGNOSException)e;
}
}
しかし、戦争 Z から test() メソッドが呼び出され、トランザクション内のいくつかのメソッドが呼び出されると、getEJBB().B(); としましょう。メソッド getEJBA().A(); が失敗します。ロールバックしません!!
私たちに何ができるでしょうか?TransactionManagementType.Container と @TransactionAttribute(TransactionAttributeType.REQUIRED) も試しましたが、どちらもロールバックせず、「ロールバック!!」というメッセージさえ出ませんでした。コンソールに出力されます。
専門家が私を助けてくれることを願っています。
ありがとう!!!