【问题标题】:Make EJB call with timeout使用超时进行 EJB 调用
【发布时间】:2012-02-13 07:00:54
【问题描述】:

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

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

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

谢谢你

附:我使用 glassfish 3.1

【问题讨论】:

    标签: jakarta-ee timeout glassfish-3 ejb-3.1


    【解决方案1】:

    我建议为此使用事务超时。

    我认为没有标准的配置方法,因此它取决于应用程序服务器。我假设您想为每个类或方法专门设置它。

    对于WebLogic,您可以在“transaction-descriptor”中的“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

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

    【讨论】:

      【解决方案2】:

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

      即使您使用@Asynchronous 并且Future.get 超时,您也只是解除了客户端等待结果的阻塞;目标 EJB 将继续执行并消耗资源。但是,对于异步方法,您确实可以从使用 Future.cancel 和 SessionContext.wasCancelCalled 的一些内置协作取消中受益。

      【讨论】:

      • 我并不是要打断 EJB。这个想法是在 30 秒后向 UI 返回响应(或“超时错误”)。
      • 当然,但是让前端超时而不让后端超时似乎是不明智的。最终,您的后端线程将被消耗,而您的前端线程无论如何都必须等待。鉴于您所说,使用@Asynchronous 可能是最好的。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多