Web服务 - 实现方面的超时

时间:2009-05-14 05:04:10

标签: java web-services

我正在调用Web服务,我希望它在5秒内响应。如果它无法在5秒内处理它(忽略网络延迟),我希望它回滚事务并向我发送超时异常。

我可以看到仅在Calling Client的代码上设置超时。我希望这由Web服务实现者(服务器端)强制执行。我似乎无法找到任何办法。

如果我通过在客户端指定超时来超时,则服务器可能会继续并完成事务。我甚至不知道原始请求是否成功,或者是否在服务器完成请求处理之前超时时遇到任何错误。

我正在使用Java客户端与EJB实现的WS进行通信。 感谢任何投入。

谢谢, Manglu

3 个答案:

答案 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"

因此,填写者可以在其主要交易中参与更新为“已填写”并在记录被取消时中止交易。

我们在两个非同步“线程”之间进行了介绍。

对于许多系统来说这已经足够了。

请记住:

  • 如果你的工作人员需要很长时间,那么整个工作组在工作结束时取消它可能会非常糟糕,用户是否会再次提交请求。
  • 当工作在JDBC的深处,你可能无法打断它,所以我们在这里讨论过的任何东西都不会阻止“失控”的查询。

如果你确实需要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