我们正在运行带有EclipseLink和JBoss Weld的JavaEE 6环境。对于EntityManager,我们目前正在使用@ConversationScoped范围,它对JSF交互非常有效。
我们现在想要包含一个@Schedule方法来自动检查数据(检查截止日期等)。但是,我不知道这是否可能,因为自动呼叫似乎无法创建对话。这是我们目前的做法:
@Stateless
public class Scheduler
@Inject
private CampaignService campaignService;
// CampaignService is @ApplicationScoped and uses an EntityManager
@Schedule(second="*/3", ...)
public void checkDeadlines(){
campaignService.getAll() // fetches all campaigns from EntityManager
...
}
}
但是,只要EntityManager是@ConversationScoped,注入就不起作用。 (ContextNotActiveException)
是否有可能"创建"除了通过调用一些JSF之外的对话?或者是创建自定义范围的唯一可能性,如How to use CDI-@SessionScoped without a http-session中所示?
答案 0 :(得分:2)
如果您要使用调度程序,最佳解决方案是使用@PersistenceContext
来获取EntityManager。另一个选择是不使用会话作用域实体管理器(无论如何应该被视为不良实践),并使用默认作用域或请求作用域实体管理器。
我说对话范围的实体管理器是不好的做法,因为它很容易导致延迟初始化问题,分离的实体和内存泄漏。