在我的应用程序中,我有一个在创建时执行重载(解析不同文件)的服务。数据是元数据,因此在运行时不会更改(本地化字符串、键/值映射等)。因此我决定将此服务设为 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 注入该服务,这将再次使服务成为“会话范围”。