2013-11-22 19 views
1

我正在开发一个EJB,它将其他组件(EJB,Web服务等)的10+调用作为其业务逻辑的一部分。就我而言,表现是一个巨大的问题。这个EJB将每天处理数百万个请求。如何超时EJB中的阻塞调用?

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

我无法等待任何一个呼叫返回的时间超过'n'秒。如果通话时间超过'n'秒,我将使用默认响应进行处理。

我通常会使用Executor来解决这个问题,但是据我所知,不应该从EJB内产生线程,因为它可能会干扰EJB的生命周期。

回答

1

如何强制超时?

的EJB3.1规范提供了使用@AccessTimeout注解,也适用于那些需要等待当会话bean实例 忙于执行前一个请求序列化客户端调用设置超时的可能性。清楚地(在说明书中描述了这一点),这适用于StateFul和Singleton会话bean,尽管它可以在bean池用完可用实例的情况下实现为无状态。 注意,一旦客户端调用的业务方法正在进行,此超时不适用。

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

设置事务超时时间既不是一个好的选择,因为不能保证当事务超时到期时执行业务逻辑的线程将被中断。

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

相反,你可以使用ManagedExecutorService类是适用于EJB容器内的Executor扩展。

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

0

因为你没有提供您的环境中的细节:

  • 使用Bean管理事务,并设置事务超时
  • EE7:提供管理执行服务
  • EE6:自定义执行服务为JCA连接器