3

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) も試しましたが、どちらもロールバックせず、「ロールバック!!」というメッセージさえ出ませんでした。コンソールに出力されます。

専門家が私を助けてくれることを願っています。

ありがとう!!!

4

0 に答える 0