如何在EJB内部超时阻塞调用?

时间:2013-11-22 16:42:22

标签: java performance java-ee timeout ejb

我正在开发一个EJB,它对其他组件(EJB,Web服务等)进行10多次调用,作为其业务逻辑的一部分。就我而言,性能是一个巨大的问题。这个EJB每天将为几百万个请求提供服务。

我的问题是:对于这10多个电话中的每一个,我如何执行超时?

我不能等待超过'n'秒的任何一个回叫。如果调用时间超过'n'秒,我将使用默认响应进行处理。

我通常会使用Executor来解决这个问题,但是根据我的理解,不应该在EJB中生成线程,因为它可能会干扰EJB的生命周期。

2 个答案:

答案 0 :(得分:1)

  

如何执行超时?

ejb3.1规范提供了使用@AccessTimeout注释设置超时的可能性,该注释适用于在会话Bean实例时必须等待的序列化客户端调用 正在忙于执行上一个请求。 显然(并且在规范中明确描述)这适用于StateFul和Singleton会话bean,尽管在bean池用完可用实例的情况下可以为Stateless实现。 请注意,一旦客户端调用的业务方法正在进行,此超时不适用。

其他可能不是规范的一部分,但由多个服务器(see JBoss example)支持,是在远程客户端定义超时。如果客户端调用 如果超过配置的超时时间,将通知客户端,但服务器执行不会被中断,这是不够的。

设置事务超时既不是一个好选项,因为无法保证在事务超时到期时执行业务逻辑的线程会被中断。

  

我通常会使用Executor来解决这个问题,但是根据我的理解,不应该在EJB中生成线程。

相反,您可以使用ManagedExecutorService类,它是适合在EJB容器中使用的Executor扩展。

另外,要在EJB中实现异步调用,请查看@Asynchronous注释,它提供了一个高级抽象来解决您面临的多线程问题。 来自Future类的Cancel()方法允许您在考虑进程耗时太长时中断线程的执行。

答案 1 :(得分:0)

因为您没有提供有关环境的更多详细信息:

  • 使用bean托管事务并设置事务超时
  • EE7:提供托管执行程序服务
  • EE6:自定义执行程序服务作为JCA连接器