保证向Web服务发送请求

时间:2015-05-20 09:28:05

标签: java web-services soap apache-camel cxf

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

  1. 尝试向Web服务发送请求。同步或异步请求无关紧要。
  2. 如果服务由于某种原因没有确认请求(例如,服务不可用),我们会在一段时间内再次尝试第1步(即有某种类型的轮询)。
  3. 问题在于步骤#2的实施(即轮询)。 这个用例看起来很常见,我认为应该已经准备好了解决方案。因此,我希望只向Web服务发送一个请求,所有其他逻辑(即其保证交付)将由某个框架执行。

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

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

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

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

    1. Brian Agnew的Spring Retry。这是一种非常通用的方法,不仅适用于Web服务。
    2. 来自Ashok Nanda的CXF故障转移。解决方案是在Web服务方面,完全满足我们的需求。
    3. 不幸的是我不能选择两个答案作为最终答案,所以我选择了Brian的第一个,因为它是第一个,他提供了一个非常好的解释,帮助我看到另一个可能的问题:-) 谢谢你们!

2 个答案:

答案 0 :(得分:4)

除了简单地在某种循环中编写请求之外,您可以查看Spring Retry等框架。

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

  

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

答案 1 :(得分:4)

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

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