2016-04-24 8 views
1

私はMasterEJB内に複数のEJBの構成を持っています。 MasterEJB自体が参照されているすべてのEJBを実行しています。 MasterEJB#が実行されるまでの方法はmyA.doSomethingWhichTakesAges();myB.doSomethingWhichTakesAges();myC.doSomethingWhichTakesAges();()が任意の別の発信者から外部実行してはならないこと1つの "マスター" EJBが処理されるまで実行を避けるためにEJBのセットをロックする方法はありますか?

@Singleton 
public class MasterEJB { 
    @EJB 
    A myA; 
    @EJB 
    B myB; 
    @EJB 
    C myC; 

    @Lock(LockType.WRITE) 
    public void execute() { 
     myA.doSomethingWhichTakesAges(); 
     myB.doSomethingWhichTakesAges(); 
     myC.doSomethingWhichTakesAges(); 
    } 
} 

問題であるが、適切に実行される:例を参照してください。

しかし、これを達成する方法は?

私はJEE7コンテナの午前(Wildfly 8/Wildfly 10)

+0

は複数回実行されます()。 – Jaumzera

+0

Jaumzera、execute()は一度だけ実行できます(並列実行なし) – cilap

+0

どのような種類のSessionBeans A、B、Cがありますか?そして、彼らのメソッド "doSmethingWhichTakesAges"はどうですか?彼らは後で走れる? – Jaumzera

答えて

0

まあ、私はあなたが具体的な応答を取得できませんでしたら、私がしたいのですが、いくつかの時間のためにあなたのポストを以下とされてきました私はまだあなたの問題を解決するための方法で考えている

@Singleton 
public class MasterEJB { 
    @EJB 
    private A myA; 
    private boolean aRead; 

    @EJB 
    private B myB; 
    private boolean aRead; 

    @EJB 
    private C myC; 
    private boolean aRead; 

    public void execute() { 
     myA.doSomethingWhichTakesAges(); 
     myB.doSomethingWhichTakesAges(); 
     myC.doSomethingWhichTakesAges(); 
    } 

    // GSO (getters and setters omitted) 
} 

@Stateless 
public class A { 

    @EJB 
    private MasterEJB masterEJB; 

    public void doSomethingWhichTakesAges() { 
     // your logic... 
     masterEJB.setARead(true); 
    } 

    public void anyOtherMethod() { 
     if(masterEJB.isARead()) { 
      // execute your logic 
     } else { 
      throw new IllegalStateException("..."); 
     } 
    } 
} 

編集

:あなたはこのような何かをしようと提案します。昨日私はあなたのために仕事をするインターセプタを定義できることに気付きました。

@Interceptor 
public class StateCheckInterceptor { 

    @EJB 
    private MasterEJB masterEJB;  

    @AroundInvoke 
    public Object checkIfReady(InvokedContext context) throws Exception { 
     // check if your masterEJB has done its job 
     return context.proceed(); 
    } 

つまり、あなたの豆に注釈を付ける(またはXMLベースのアプローチを使用して)すべての(または各)メソッドを実行する前にそれを使用することができます。

ここに仕様があります。http://docs.oracle.com/javaee/6/tutorial/doc/gkigq.html 私はそれが助けてくれることを願っています。

関連する問題