如何将超时设置为 EJB 方法(在无状态 bean 中)

Posted

技术标签:

【中文标题】如何将超时设置为 EJB 方法(在无状态 bean 中)【英文标题】:How to set timeout to an EJB-Method (in stateless bean) 【发布时间】:2014-10-26 17:26:00 【问题描述】:

我有一个无状态会话 bean,一个方法需要 6 分钟才能返回结果,因为我得到了“超时”异常。我注意到超时已经在 Wildfly Standalone.xml 或 persistence.xml 中设置了

<session-bean>
   <stateful default-access-timeout="12000" cache-ref="simple" passivation-disabled-cache-ref="simple"/>
   <singleton default-access-timeout="12000"/>
</session-bean>

<property name="javax.persistence.query.timeout" value="120000" />

但它仅适用于有状态的 bean。如何将超时设置为无状态 bean 中的一种方法?

【问题讨论】:

【参考方案1】:

我尝试了以下注释,它似乎工作:

    @AccessTimeout(value = 15, unit = TimeUnit.MINUTES)
    @Override
    public void myMethod() 
        //do something
    

【讨论】:

这听起来很令人惊讶。 Javadoc 声明“此注释可以应用于 有状态会话 bean 或使用容器管理并发的 单例会话 bean。默认情况下,允许客户端进行并发调用到有状态会话对象,并且容器需要序列化此类并发请求。AccessTimeout 注释用于指定在 bean 实例已经在处理不同请求的情况下,有状态会话 bean 请求应该阻塞的时间量。" 这个答案似乎是错误的。 @AccessTimeout 是关于等待时间的,因为有状态 bean 的方法默认是同步的。 openejb.apache.org/examples-trunk/access-timeout

以上是关于如何将超时设置为 EJB 方法(在无状态 bean 中)的主要内容,如果未能解决你的问题,请参考以下文章

@Stateless和@Asynchronous EJB之间的JPA事务处理

如何在无状态会话 bean 中创建多线程?

sessionscoped 托管 bean 与有状态 ejb

在条件下在无状态会话 Bean 中注入特定的 EntityManager

何时在无状态会话 bean 上使用有状态会话 bean?

EJB和同步