3

我们正在使用 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 之外,是否有可能“创建”对话?或者是创建自定义范围的唯一可能性,如如何在没有 http-session 的情况下使用 CDI-@SessionScoped

4

1 回答 1

2

如果您要使用调度程序,最好的解决方案是使用@PersistenceContext获取 EntityManager。另一种选择是不使用会话范围的实体管理器(无论如何都应该被认为是不好的做法),并使用默认的范围或请求范围的实体管理器。

我说会话范围的实体管理器是不好的做法,因为它很容易导致延迟初始化问题、分离实体和内存泄漏。

于 2013-07-02T18:10:18.717 回答