2011-12-15 21 views
5

JMSを使用して@MessageDriven EJBにリクエストスコープのCDI Beanを注入した場合、以下のように指定された任意のFooインスタンスは、一度に1回だけonMessage呼び出し?@RequestScoped @MessageDriven BeanへのCDIインジェクション

つまり、以下の例では、Fooオブジェクトのメンバ変数を使用して、JSF @RequestScopedマネージドBeanと同様にサブルーチン全体にステートを格納できますか?同じFooオブジェクトがあれば、各MessageDrivenBeanインスタンスは、2つの要求の処理を同時に単離されるであろうように、独自Fooインスタンスを有するように、次の1つのonMessageコールから順に再循環されます場合にはOKということ

注意。

@MessageDriven 
public class MessageDrivenBean implements MessageListener { 
    @Inject 
    private Foo foo; 

    public void onMessage(Message m) { 
     foo.doSomething(); 
    } 
} 

@Named 
@RequestScoped 
public class Foo { 
    private String property; 
    public void doSomething() { 
     property = ...; 
    } 
} 

答えて

10

WRT要求スコープ/コンテキストでは、6.7.1項のCDI仕様では、MessageListenerを実装するメッセージ駆動型Beanに対してアクティブになると記載されています。メッセージの配信後も破棄されるため、配信される各メッセージに対して新しいインスタンスが作成されます。さらに、セクション6.7.3では、アプリケーションコンテキストもアクティブであると述べています(予想通り)。会話およびセッションスコープはアクティブではありません。

+0

それはまさに私が望んでいたものであり、注入されたオブジェクトにインスタンスカウンタを置くことで確認しました。 (これは最初から行っていなかったし、右のjavax.enterpriseのものではなくjavax.facesから '@ RequestScoped'アノテーションをインポートしたことが判明しました)。 – wrschneider

1

これが機能するのだろうかと思います。 MDBとどのようなプロトコルを使いたいですか?

ほとんどの場合、MDBは(JMSなどを介して)非同期に呼び出されるため、onMessage()が呼び出されているときにアクティブな要求はありません。通常、MDBはまた、彼らが聞いているプロトコル(例えば、MDBがjavax.jms.MessageListenerを実装する必要があるJMSの場合)と一致するインタフェースを実装することも要求される。

+0

はいJMSを使用しています。上記の例で明確化されています。このコンテキストでは、「リクエストスコープ」によって、私は本当に「シングルトンではない」と言います。言い換えれば、新しい 'Foo'が各MDBインスタンスに注入され、同時に2つの' onMessage'ハンドラが衝突しないようにします。 – wrschneider

関連する問題