SessionScope和Scheduled线程

时间:2013-05-03 12:02:42

标签: multithreading jsf session jboss-weld

在我的应用程序中,我有一项服务,可以在创建时执行大量加载(解析不同的文件)。数据是元数据,所以在运行时不会改变(本地化字符串,键/值映射等)因此我决定使用ServiceScoped,所以我不需要为每个请求解析值。当用户再次登录时,不应用ApplicationScoped以确保刷新数据。

这很好用,但现在我需要在一个线程中访问该服务,该线程使用@Schedule Annotation运行。当然,韦尔德不喜欢这样说,并说: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服务吗?

编辑:我知道,服务不应该是SessionScoped,也不应该包含任何数据(-Collections)。但是在这种情况下,避免多个文件系统访问似乎是合法的。

我考虑过将服务转换为无范围的服务,并在会话范围的bean中“缓存”数据。但是,我需要将会话bean注入该服务,这将是 再次使服务类型为“会话范围”。

1 个答案:

答案 0 :(得分:0)

不应该这样做:

@Inject @New
LocalizationService localizationService; 

至少,这就是我对规范的解释。