【问题标题】:SessionScope and Scheduled threadsSessionScope 和计划线程
【发布时间】:2013-05-03 12:02:41
【问题描述】:

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

这很好用,但现在我需要在一个线程中访问该服务,该线程使用@Schedule 注释运行。 Weld 当然不喜欢这样说: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
    }
}

此时我可以手动创建一个 Session,以便我可以使用 SessionScoped 服务吗?

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

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

【问题讨论】:

    标签: multithreading jsf session jboss-weld


    【解决方案1】:

    这不应该工作吗:

    @Inject @New
    LocalizationService localizationService; 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多