【问题标题】:Akka, Camel and HTTP pollingAkka、Camel 和 HTTP 轮询
【发布时间】:2014-02-14 10:08:15
【问题描述】:

我看到 Apache Camel 有一个轮询消费者 (http://camel.apache.org/polling-consumer.html),我想知道是否有任何方法可以从 Akka 使用它来轮询 HTTP REST API?

其他类似的问题,Consumer Poll Rate with Akka, SQS, and CamelAkka for REST polling 似乎自己实现了轮询逻辑,如果可能的话,我宁愿只使用骆驼提供的东西。

【问题讨论】:

    标签: scala apache-camel akka


    【解决方案1】:

    您有两个选择(示例代码使用 Java):

    1) 使用“timer”(或用于更高级用途的石英)Camel 组件。然后你需要一个非常简单的 Timer Actor,它会在每个周期调用一个新的 HTTProducer Actor:

        public class TimerConsumer extends UntypedConsumerActor{
    
        //Generates an event every 60 seconds:
        @Override
        public String getEndpointUri() {
            return "timer://foo?fixedRate=true&period=15000";
        }
    
        @Override
        public void onReceive(Object m) throws Exception {
            if (m instanceof CamelMessage){
                System.out.println("New Event (every 15sec)");
                Akka.system().actorOf(Props.create(HTTProducer.class)).tell("http://google.com", getSelf());
            }
        }
    }
    

    2) 使用Akka Scheduler

    //Somewhere in the beginning of your application (Global.java for Play Framework 2)
    ActorRef httpActor = Akka.system().actorOf(Props.create(HTTProducer.class));
    //A message every 15s to the httpActor
    Akka.system().scheduler().schedule(Duration.Zero(),
    Duration.create(15, TimeUnit.SECONDS), httpActor, "http://google.com",
    Akka.system().dispatcher(), null);
    

    用于选项 1) 和 2) 的常见 HTTProducer Actor 如下(为测试目的而简化):

    public class HTTProducer extends UntypedProducerActor {
    
        @Override
        public String getEndpointUri() {
            return "http://empty.com";
        }
    
        @Override
        public Object onTransformOutgoingMessage(Object m) {
            if (m instanceof String){
                Map<String,Object> headers=new HashMap<>();
                headers.put(Exchange.HTTP_URI, (String)m);
                headers.put(Exchange.HTTP_METHOD, "GET");
                return super.onTransformOutgoingMessage(new CamelMessage(null,headers));
            }
            return super.onTransformOutgoingMessage(m);
        }
    
        @Override
        public void onRouteResponse(Object m) {
            if (m instanceof CamelMessage){
                CamelMessage message=(CamelMessage) m;
                System.out.println("Response: " + message.getBodyAs(String.class, getCamelContext()));
                System.out.println("Code: " + message.headers().get(Exchange.HTTP_RESPONSE_CODE).get());
            }
        }
    

    所以我推荐第二种方法,因为你只需要创建一个Actor和一个Scheduler

    【讨论】:

    • 谢谢,我试试第二种方法。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多