2014-02-14 4 views
0

Apache Camel에 폴링 소비자 (http://camel.apache.org/polling-consumer.html)가 있습니다. Akka에서 HTTP REST API를 폴링 할 수있는 방법이 있는지 궁금합니다.Akka, Camel 및 HTTP 폴링

기타 유사한 질문 (Consumer Poll Rate with Akka, SQS, and CamelAkka for REST polling)은 폴링 논리를 직접 구현 한 것 같습니다. 가능한 경우 낙타가 제공하는 것을 사용하는 것이 좋습니다.

1) "timer"(또는 고급 목적으로 석영) 낙타 구성 요소를 사용하여

답변

2

당신은 두 가지 옵션 (예제 코드는 자바에있는)가 있습니다.

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); 

그리고 일반적인 HTTProducer 배우를 사용 : 그럼 당신은 모든 기간에 새로운 HTTProducer 배우를 호출 매우 간단한 타이머 배우 필요 옵션 1) 및 2)는 다음과 같습니다 (테스트 목적으로 간소화 됨) :

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()); 
     } 
    } 

그래서 액터와 스케줄러를 생성해야하기 때문에 두 번째 접근법을 권장합니다.

+0

감사합니다. – prio