私のアプリケーションでは、作成時に重い読み込み (さまざまなファイルの解析) を実行するサービスがあります。データはメタデータであるため、実行時に変更されません (ローカライズされた文字列、キー/値のマッピングなど)。したがって、この 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 サービスを使用できますか?
編集:ServiceはSessionScopedを使用したり、Data(-Collections)を保持したりしないでください。ただし、この状況では、複数のファイルシステムへのアクセスを避けることが正当に思えます。
サービスをスコープ外のサービスにして、データをセッション スコープ Bean に「キャッシュ」することを考えました。ただし、そのサービスにセッション Bean を注入する必要があります。これにより、サービスは再び「セッション スコープ」になります。