我看到Apache Camel有一个轮询消费者(http://camel.apache.org/polling-consumer.html),我想知道是否有任何方法可以使用Akka来调查HTTP REST API?
其他类似的问题,Consumer Poll Rate with Akka, SQS, and Camel和Akka for REST polling似乎自己实现了轮询逻辑,我更愿意只使用驼峰提供的内容。
答案 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