我有一个EJB A
,它调用EJB B
。UI等待响应的时间不应超过30秒。如果某些数据丢失,它应该返回部分响应。
如何在EJB B
上定义超时(时间限制为30秒)?
我可以将EJB B
定义为返回Future
的Asynchronous
,然后执行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.cancel
和SessionContext.wasCancelCalled
获得一些内置的协作取消功能。
要为应用于其所有方法的bean配置超时,您必须在glassfish-ejb-jar.xml中配置属性cmt-timeout-in-seconds
。
这个超时值由启动新事务的bean的所有方法使用,当它们加入其他正在进行的事务时不适用。
也可以参考此链接了解有关超时的更多详细信息。