不确定如何为该问题加上标题,但希望说明可以提供更好的解释。我正在寻找一种方法,用自定义注释(例如“ @Duration”或类似aaa)注释ejb方法或cdi方法,以便在给定的持续时间过长之后杀死方法执行。我想一些伪代码将使一切变得清晰:

public class myEJBorCdiBean {

@Duration(seconds = 5)
public List<Data> complexTask(..., ...)
{
  while(..)
  // this takes more time than the given 5 seconds so throw execption
}


综上所述,一种方法花费的时间非常长,并且它将抛出给定的持续时间过期错误或类似的东西

Kinda有一个超时机制,我不知道是否已经有类似的东西,我对javaEE世界还是陌生的。

在此先感谢大家

最佳答案

您不应在EJB / CDI容器内使用Threading API。 EJB规范明确指出:


  企业bean不得尝试管理线程。企业
  bean不得尝试启动,停止,挂起或恢复线程,或者
  更改线程的优先级或名称。企业bean不得
  尝试管理线程组。


容器必须完全控制托管bean及其业务方法的调用,以避免损坏其状态。根据您的用例,可以将此操作转移到专用服务(javaee外部),或者可以使用EJB @SingletonSchedule提出一些半黑客解决方案-这样您就可以定期检查一些控制标志。如果您在Wildfly / JBoss上运行,则可能会误用@TransactionTimeout注释-因为EJB方法默认情况下支持事务,所以在Transaction上设置超时将有效地控制bean方法的调用超时。我不确定其他应用程序服务器如何支持它。

如果可以选择异步处理,那么EJB @Asynchronous可能会有帮助:请参见Asynchronous tutorial - Cancelling and asynchronous operation

作为一般建议:不要在EJB / CDI中运行长时间运行的操作。每个请求都会产生一个新线程,线程是有限的资源,您的应用将很难扩展和维护(长时间运行op〜=状态),如果您的服务器在方法调用期间崩溃,会发生什么情况,用例如何在集群中工作环境。再次很难说,什么是更好的方法而不了解您的用例,但是要研究Java EE批处理api,具有消息驱动Bean的JMS或使用@Asynchronous进行异步处理

09-15 22:15