使EJB调用超时



我有一个EJB A,它调用EJB B。UI等待响应的时间不应超过30秒。如果某些数据丢失,它应该返回部分响应。

如何在EJB B上定义超时(时间限制为30秒)?

我可以将EJB B定义为返回FutureAsynchronous,然后执行Future.get(30, TimeUnit.SECONDS)。但这是最好的解决方案吗?

谢谢

附言:我使用glassfish 3.1

我建议使用事务超时。

我不认为有一种标准的配置方式,所以它将取决于应用程序服务器。我假设您希望为每个类或方法专门设置它。

对于WebLogic,您可以在"事务描述符"中的"WebLogic ejb jar.xml"中指定它,或者使用注释"@TransactionTimeoutSeconds"。

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

对于JBoss AS,您可以使用注释"@TransactionTimeout"或在"JBoss.xml"中设置事务超时。

https://community.jboss.org/wiki/TransactionTimeout

我确信每个应用程序服务器中都有类似的配置选项。

没有办法中断目标EJB。唯一真正的选择是让目标EJB协同并定期检查它是否超过了预期的目标响应时间。

即使您使用@Asynchronous并且Future.get超时,您也只是简单地阻止客户端等待结果;目标EJB将继续执行并消耗资源。但是,使用异步方法,您确实可以使用Future.cancelSessionContext.wasCancelCalled获得一些内置的协作取消功能。

要为应用于其所有方法的bean配置超时,您必须在glassfish-ejb-jar.xml中配置属性cmt-timeout-in-seconds

这个超时值由启动新事务的bean的所有方法使用,当它们加入其他正在进行的事务时不适用。

也可以参考此链接了解有关超时的更多详细信息。

相关内容

  • 没有找到相关文章