2016-06-13 11 views
5

httpインターフェイスを持たないJava EEアプリケーションを開発しています。データの送受信にMQTTのみを使用しています。非httpアプリケーションのCDIスコープ

CDI @SessionScoped@RequestScopedがこのシナリオに当てはまるのか、クライアントの要求を処理するためのカスタムスコープを定義する必要があるのでしょうか。

編集は私がコールバックを受け取るMQTTに@SessionScopedまたは@RequestScoped Beanを注入し、簡単なアプリケーションを試してみましたが、私はアクティブなコンテキストを持っていないという例外が発生しました。

豆のライフサイクルが選択されたスコープに従うようにプログラムでコンテキストをアクティブにすることはできますか?

PS:私は質問を投稿したときに、私はその簡単なテストを作るのが面倒ではなかったが、可能性あなたがそこ..です

答えて

2

私はCDIスコープ理論に深く行くことがcouriousだった...と、まだ私はリクエストやセッションのコンテキストを自分自身で作成する必要があります。

もちろん、CDIの実装とアプリケーション固有です。

たとえば、Weldを使用してリクエストスコープが必要な場合は、org.jboss.weld.context.bound.BoundRequestContextを作成してアクティブ化できます。

 /* Inject the BoundRequestContext. */ 

    /* Alternatively, you could look this up from the BeanManager */ 

    @Inject BoundRequestContext requestContext; 


    ... 


    /* Start the request, providing a data store which will last the lifetime of the request */ 

    public void startRequest(Map<String, Object> requestDataStore) { 

     // Associate the store with the context and activate the context 

     requestContext.associate(requestDataStore); 

     requestContext.activate(); 

    } 


    /* End the request, providing the same data store as was used to start the request */ 

    public void endRequest(Map<String, Object> requestDataStore) { 

     try { 

     /* Invalidate the request (all bean instances will be scheduled for destruction) */ 

     requestContext.invalidate(); 

     /* Deactivate the request, causing all bean instances to be destroyed (as the context is invalid) */ 

     requestContext.deactivate(); 

     } finally { 

     /* Ensure that whatever happens we dissociate to prevent any memory leaks */ 

     requestContext.dissociate(requestDataStore); 

     } 

    } 

あなたはBoundConversationContextのためにここにhttps://docs.jboss.org/weld/reference/latest/en-US/html/contexts.html

また情報と、この例を見つけたことができます。 セッションのスコープが少し難しくなっているので、アプリケーションで実際のセッションをサポートする必要があります。

+0

あなたの答えに感謝します!私はあなたがリンクしたドキュメントを読んで、役に立つ情報を見つけました。残念ながら、私は 'BoundConversationContext'の使用方法をまだ理解していません:Beanにコンテキストを注入する必要があります。リクエストスコープを持ち、投稿したコードを"コピー - ペースト "したいですか?コードからこれらのメソッドを呼び出すか、コンテナで使用する必要がありますか?私は 'requestDataStore'を管理すべきですか? –

+0

Scoped Beanにアクセスして後で非アクティブ化する前に、スコープコンテキストを関連付けてアクティブ化する必要があります。つまり、Beanの外で行う必要があります。あなたのケースでは、たとえば、何らかの種類の偶数またはデータが受信され、タイムアウト後にそれを非アクティブにすると、会話コンテキストを作成できます。 – temaleva

関連する問題