1

私のアプリケーションでは、作成時に重い読み込み (さまざまなファイルの解析) を実行するサービスがあります。データはメタデータであるため、実行時に変更されません (ローカライズされた文字列、キー/値のマッピングなど)。したがって、この Service を SessionScoped にすることにしたので、すべての要求で値を解析する必要はありません。ユーザーが再度ログインしたときにデータが更新されることを確認するために、ApplicationScoped ではありません。

これはかなりうまく機能しますが、@Schedule注釈で実行されるスレッド内でそのサービスにアクセスする必要があります。もちろん、ウェルドはそれを好まず、次のように述べています。org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped

@Singleton
public class DailyMails {

    @Inject
    MailService mailService; //just Named

    @Inject
    GroupDataService groupDataService; //Stateless

    @Inject
    LocalizationService localizationService; //SessionScoped

    @Schedule(hour = "2", minute = "0", second = "0", dayOfWeek="Mon,Tue,Wed,Thu,Fri", persistent = false)
    public void run() {
        //do work
    }
}

この時点で手動でセッションを作成して、SessionScoped サービスを使用できますか?

編集:ServiceSessionScopedを使用したり、Data(-Collections)を保持したりしないでください。ただし、この状況では、複数のファイルシステムへのアクセスを避けることが正当に思えます。

サービスをスコープ外のサービスにして、データをセッション スコープ Bean に「キャッシュ」することを考えました。ただし、そのサービスにセッション Bean を注入する必要があります。これにより、サービスは再び「セッション スコープ」になります。

4

1 に答える 1

0

これはうまくいかないはずです:

@Inject @New
LocalizationService localizationService; 

少なくとも、それが私が仕様を解釈する方法です。

于 2013-05-03T13:05:53.110 に答える