保证向 Web 服务发送请求

nic*_*tev 4 java soap web-services cxf apache-camel

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

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

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

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

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

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

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

  1. 来自 Brian Agnew 的 Spring Retry。这是一种相当通用的方法,不仅适用于 Web 服务。
  2. Ashok Nanda 的 CXF 故障转移。该解决方案是在网络服务方面,完美地满足了我们的需求。

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

Bri*_*new 5

撇开简单地在某种循环中编写您的请求不谈,您可以查看诸如Spring Retry 之类的框架。

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

幂等 HTTP 方法是可以多次调用而不会产生不同结果的 HTTP 方法。方法是只调用一次还是十次都没有关系。结果应该是一样的。同样,这仅适用于结果,而不适用于资源本身。这仍然可以被操纵(如更新时间戳,前提是此信息未在(当前)资源表示中共享。


Ash*_*oka 5

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

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