我正在开发一个EJB,它对其他组件(EJB,Web服务等)进行10多次调用,作为其业务逻辑的一部分。就我而言,性能是一个巨大的问题。这个EJB每天将为几百万个请求提供服务。
我的问题是:对于这10多个电话中的每一个,我如何执行超时?
我不能等待超过'n'秒的任何一个回叫。如果调用时间超过'n'秒,我将使用默认响应进行处理。
我通常会使用Executor来解决这个问题,但是根据我的理解,不应该在EJB中生成线程,因为它可能会干扰EJB的生命周期。
答案 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)
因为您没有提供有关环境的更多详细信息: