Java CDI ConversationScope通过调用Timer?

时间:2013-07-02 07:47:53

标签: java cdi scopes

我们正在运行带有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中所示?

1 个答案:

答案 0 :(得分:2)

如果您要使用调度程序,最佳解决方案是使用@PersistenceContext来获取EntityManager。另一个选择是不使用会话作用域实体管理器(无论如何应该被视为不良实践),并使用默认作用域或请求作用域实体管理器。

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