2

ステートフル EJB 自体からトランザクション メソッドを呼び出すことはできますか? より明確に話すには:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Stateless
public class MyService {

    @Resource
    SessionContext ctx;

    public void myMethod()  {
        // do something...

        // invoke method from the same class

        // As expected - this doesn't work as it's a regular local-call, 
        // it's not aware of EJB nature of this call.
        save();

        // Doesn't work (although it worked with SLSB)
        ctx.getBusinessObject(MyService.class).save();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void save() {
        // do something...
    }
}

今私が達成したいのは、ユーザーが myMethod(); を呼び出せるようにすることです。このメソッドが JTA トランザクションなしで実行されることを確認したいと思います。この呼び出しの後、save(); を呼び出したいと思います。トランザクション内で実行されるメソッド。

ctx.getBusinessObject(-) メソッドを使用すると、次のようになります。

警告: EJB MyService メソッド public void com.test.MyService.save() の呼び出し中にシステム例外が発生しました javax.ejb.IllegalLoopbackException:不正な再入可能アクセス: メソッド 'public void com.test.MyService でループバック呼び出しを実行しようとしていますステートフル セッション Bean MyService の .save()

内部呼び出しは SFSB ではサポートされていませんか?

Glassfish 3.1.1 を実行しています。

4

1 に答える 1

2

Glassfish EJB 実装のバグである可能性があります。これは、異なるトランザクション属性でメソッドを呼び出すときだけでなく、ステートフル セッション Bean へのすべての再入可能呼び出しで発生します。

単純なテスト メソッドをステートフル Bean に配置して、ビジネス オブジェクト プロキシ経由で呼び出してみてください。同じ例外が発生します。

JBoss AS 7 では、ステートフル Bean への再入可能呼び出し許可されます。ちなみに、少し前に OpenEJB にも同様のバグがありました: https://issues.apache.org/jira/browse/OPENEJB-1099

于 2011-11-04T12:01:51.033 に答える