保证将请求发送到 Web 服务

Guaranteed sending of a request to a web service

我们需要保证网络服务请求的发送。步骤如下:

  1. 尝试向 Web 服务发送请求。同步或异步请求无关紧要。
  2. 如果服务出于某种原因不确认请求(例如服务不可用),我们会在一段时间后再次尝试步骤 #1(即有某种轮询)。

问题出在步骤 #2(即轮询)的实施中。 这个用例看起来很常见,我认为应该已经有解决方案了。所以我希望只向 Web 服务发送一个请求,所有其他逻辑(即它的保证交付)将由某个框架执行。

你知道这样的解决方案吗?

有“Guaranteed delivery”EIP模式,Camel支持。但我没有找到任何信息,Camel 如何支持它以及它是否适合我们的情况。

我们的要求 - Java、SOAP、开源解决方案。 我们计划使用 Apache CXF,但这并不重要。

最后的话: 提供了 2 个很好的答案:

  1. Spring Brian Agnew 重试。这是一种相当通用的方法,不仅适用于 Web 服务。
  2. Ashok Nanda 的 CXF 故障转移。解决方案是在网络服务方面,完全符合我们的需求。

不幸的是,我不能同时选择两个答案作为最终答案,所以我选择了 Brian 的答案,因为它是第一个,他提供了一个非常好的解释,帮助我看到了另一个可能的问题:-) 谢谢大家!

抛开简单地在某种循环中编写您的请求,您可以查看 Spring Retry 等框架。

它将允许您定义重试策略以考虑退避策略、超时和 when/when 尝试重试。最后一个要素至关重要。如果一开始无法连接,则重试是可行的。另一方面,如果您连接并发送请求但未能获得确认,那么您需要了解重试是否合适。 idempotency of requests 的概念在这种情况下很重要。

An idempotent HTTP method is a HTTP method that can be called many times without different outcomes. It would not matter if the method is called only once, or ten times over. The result should be the same. Again, this only applies to the result, not the resource itself. This still can be manipulated (like an update-timestamp, provided this information is not shared in the (current) resource representation.

在 Apache-CXF 中,可以在目标端点关闭时使用 org.apache.cxf.clustering.RetryStrategy 重试消息传递 class 及其扩展。 请参考:http://cxf.apache.org/docs/failoverfeature.html

这是主要运行时 cxf 库 cxf-rt-features-clustering.jar 的一部分,甚至可以在 OSGi/non-OSGi 或 Camel 环境中工作。