apache骆驼轮询休息端点

Posted

技术标签:

【中文标题】apache骆驼轮询休息端点【英文标题】:apache camel polling a rest endpoint 【发布时间】:2016-11-23 09:50:47 【问题描述】:

我有一个休息端点 sample.org,它返回格式为 json 的响应


  "response" : "pending" 

我的路线是这样的

from("http://sample.org")
.marshal(xmlFormatConverterUtil.getxmlJsonDataFormat())  //To convert into json as I receive data in xml format which needs to be converted to json

我阅读了有关 polling consumer 的信息,但找不到有关如何继续轮询端点的示例,直到它返回响应为“成功”。

应该使用轮询消费者吗?如果是这样,可以说明与我的案例相关的示例。任何其他轮询休息端点的资源都将非常有用。

【问题讨论】:

轮询 http 端点是什么意思?该路由正在侦听暴露的 http url。每当有人向该网址发送请求时,您都会收到该消息。这里没有投票。 通过轮询我的意思是,我将继续向端点发出 GET 请求,并且每次我都会检查我的响应是什么。当响应成功时,我将停止轮询端点 【参考方案1】:

您需要从计时器开始,然后调用其余端点。然后您可以检查结果,如果结果,则使用 controlbus 停止路线。过滤器可用于检查其是否挂起,然后停止继续路由,然后下一个计时器将重试。

沿着这条伪路线前进

from timer
  to http
  marshal
  filter (if pending)
     stop 
  end
  to something with positive response
  to controlbus stop route

您可以在

找到更多详细信息 http://camel.apache.org/timer http://camel.apache.org/controlbus http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html http://camel.apache.org/message-filter.html

【讨论】:

新书怎么样了?我的第 1 版副本全是狗耳朵的。 我们有 2.5 章要写,Henryk 会写 IoC 章。但是从明年开始,我们已经完成了所有这些,然后是它的证明,排版。在 2017 年夏天之前完成。【参考方案2】:

我遇到了类似的问题,最后通过writing a custom endpoint 进行投票。

它作为生产者工作并轮询指定的 uri,直到满足指定的谓词或轮询达到最大尝试次数。

from("direct:start")
  .to("poll:http://example.com/status?maxRetries=3&successPredicate=#statusSuccess")

轮询端点使用一个简单的处理器,该处理器使用轮询消费者进行轮询。

public class PollProcessor implements Processor 

    private final String uri;
    private final long requestTimeoutMs;
    private final long period;
    private final int maxTries;
    private final Predicate<Exchange> successPredicate;

    public PollProcessor(String uri, long requestTimeoutMs, long period, int maxTries, Predicate<Exchange> successPredicate) 
        Preconditions.checkArgument(maxTries > 0);
        Preconditions.checkArgument(period >= 0);
        Preconditions.checkNotNull(successPredicate);

        this.uri = uri;
        this.requestTimeoutMs = requestTimeoutMs;
        this.period = period;
        this.maxTries = maxTries;
        this.successPredicate = successPredicate;
    

    @Override
    public void process(Exchange exchange) throws Exception 
        PollingConsumer consumer = exchange.getContext().getEndpoint(uri).createPollingConsumer();

        for (int tryNumber = 1; tryNumber <= maxTries; ++tryNumber) 
            Exchange pollExchange = consumer.receive(requestTimeoutMs);
            if (successPredicate.test(pollExchange)) 
                exchange.setOut(pollExchange.getOut());
                exchange.setException(pollExchange.getException());
                return;
            

            log.warn("Polling  failed try number , waiting  ms for next try...", uri, tryNumber);
            Thread.sleep(period);
        

        throw new RuntimeException("Polling failed maximum allowed number of tries [" + maxTries + "], see log for details.");
    

【讨论】:

很好:D 我通过在我的路线中循环使用计时器和重试计数来解决它,类似于你所做的。

以上是关于apache骆驼轮询休息端点的主要内容,如果未能解决你的问题,请参考以下文章

Apache Camel - Spring 休息端点参考

Apache骆驼休息服务

骆驼如何将授权标头添加到休息路线?

使用ftl进行骆驼休息响应

并排托管 WCF 肥皂和休息端点

单个休息“放置”端点是不是足以更新带有嵌套数组的文档?