我正在调用Web服务,我希望它在5秒内响应。如果它无法在5秒内处理它(忽略网络延迟),我希望它回滚事务并向我发送超时异常。
我可以看到仅在Calling Client的代码上设置超时。我希望这由Web服务实现者(服务器端)强制执行。我似乎无法找到任何办法。
如果我通过在客户端指定超时来超时,则服务器可能会继续并完成事务。我甚至不知道原始请求是否成功,或者是否在服务器完成请求处理之前超时时遇到任何错误。
我正在使用Java客户端与EJB实现的WS进行通信。 感谢任何投入。
谢谢, Manglu
答案 0 :(得分:0)
如果我说得对,EJB实现了服务,它将在5秒内响应或回滚事务并发送超时响应。看起来你还需要有状态的bean,因为你想单独跟踪每个服务调用的时间。
我会从EJB为每个服务调用启动一个'kill'线程。线程将等待5秒并在该时间段之后通知EJB,它必须回滚并响应错误消息。 EJB可以终止(通常)情况下的kill线程,它可以在预期的时间范围内响应。
答案 1 :(得分:0)
我认为大多数J2EE应用服务器都允许您设置最大事务时间,并在超过该时间后回滚。因为您希望以一种很好的方式响应调用者,所以您可以考虑将事务的“肉”放在Bean A中,并在Bean B中使用SOAP处理。因此,在Bean B中,您捕获RollbackException(我认为有一个超时的子类?)并以很好的方式响应你的调用者。
如果您正在使用JBoss(可能还有其他应用服务器?),您显然可以使用BMT并动态设置事务超时。 http://www.jboss.org/community/wiki/TransactionTimeout
答案 2 :(得分:0)
我会建议一种可行的模式。但首先......我想建议也许这个要求可能会从一点解释中受益。实际上发生了什么需要5秒的超时,并且需要非常确定(中止事务确定)如果达到超时则不会发生这项工作?在这种情况下,如果用户在看到结果之前他的浏览器崩溃或发生网络故障,用户会有多么不安 - 因为在这种情况下我们无法从客户端了解发生了什么,并且客户端处于问题(几乎不可避免地)不参与交易。
因此,不同的交互模型可能更容易实现,并提供相当好的可靠性。我将描述该模型,然后解释如何在你需要的时候优化它以给出5秒超时。
我建议的互动模式是“下订单,后续检查”模式。这就是用于在线交易系统的内容。客户端发送请求,系统将请求安全地移到某处,并立即响应客户端。不需要超时,很快就会存在。然后在一个工作线程(使用Java EE领域的MDB,或WebSphere的异步bean)中,可以完成真正的工作。
客户稍后可以询问“订单编号73,它是怎么回事?”或“请取消订单73”。使用Ajax或回调技术,我们可以在该模型上提供非常好的UI。
请注意,客户端说“取消”并且系统“完成那个”的实现需要通过适当的锁定来调解,通常由某个数据库进行调解。
使用乐观锁定,SQL语句意味着类似
Update order 73 to cancelled WHERE its state is working
if the number of rows updated == 0 then "TOO LATE we already filled it"
因此,填写者可以在其主要交易中参与更新为“已填写”并在记录被取消时中止交易。
我们在两个非同步“线程”之间进行了介绍。
对于许多系统来说这已经足够了。
请记住:
如果你确实需要5秒的超时时间,那么你所做的只是上面所做的事情,除了服务被编码为在睡觉后进行取消检查,而不是立即返回到客户端并在稍后的单独请求中进行检查。所以客户端代码看起来像:
Begin tran
stash request
Commit
// now the worker may get round to starting the work sometime
Sleep 5 seconds
Begin Tran
attempt to cancel!
// that will fail if the work is completed
// the WHERE will not find the record in the right state
if update worked COMMIT
// now worker cannot complete
else ABORT
// by here the work is either complete or cancelled
// even if worker is still running it cannot complete
return state of record