Akka,Camel和HTTP民意调查

时间:2014-02-14 10:08:16

标签: scala apache-camel akka

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

其他类似的问题,Consumer Poll Rate with Akka, SQS, and CamelAkka for REST polling似乎自己实现了轮询逻辑,我更愿意只使用驼峰提供的内容。

1 个答案:

答案 0 :(得分:2)

您有两个选项(示例代码使用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