不确定如何为该问题加上标题,但希望说明可以提供更好的解释。我正在寻找一种方法,用自定义注释(例如“ @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 @Singleton
和Schedule
提出一些半黑客解决方案-这样您就可以定期检查一些控制标志。如果您在Wildfly / JBoss上运行,则可能会误用@TransactionTimeout
注释-因为EJB方法默认情况下支持事务,所以在Transaction上设置超时将有效地控制bean方法的调用超时。我不确定其他应用程序服务器如何支持它。
如果可以选择异步处理,那么EJB @Asynchronous
可能会有帮助:请参见Asynchronous tutorial - Cancelling and asynchronous operation。
作为一般建议:不要在EJB / CDI中运行长时间运行的操作。每个请求都会产生一个新线程,线程是有限的资源,您的应用将很难扩展和维护(长时间运行op〜=状态),如果您的服务器在方法调用期间崩溃,会发生什么情况,用例如何在集群中工作环境。再次很难说,什么是更好的方法而不了解您的用例,但是要研究Java EE批处理api,具有消息驱动Bean的JMS或使用@Asynchronous
进行异步处理