gpt4 book ai didi

java - 如何使 EJB 内的阻塞调用超时?

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:33 26 4
gpt4 key购买 nike

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

我的问题是:对于这 10 多个调用中的每一个,我如何强制执行超时?

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

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

最佳答案

how can I enforce a timeout?

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

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

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

I would normally use a Executor to solve this problem but, from what I understand, one shouldn't spawn threads from within an EJB..

您可以使用 ManagedExecutorService类是适合在 EJB 容器中使用的执行程序扩展。

此外,要在 EJB 中实现异步调用,请查看 @Asynchronous注释,它提供了高级抽象来解决您面临的多线程问题。来自 Future 的 Cancel() 方法类,如果您认为进程花费的时间太长,则允许您中断线程的执行。

关于java - 如何使 EJB 内的阻塞调用超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com