2014-02-14 64 views

回答

2

你有两个选择(例子中的代码是Java):

1)使用“timer”(或石英更高级的目的)骆驼组成部分。然后,你需要一个非常简单的定时器演员这是在每一个时期调用一个新的HTTProducer演员:

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演员同时用于选项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()); 
     } 
    } 

所以我建议第二种方法,因为你只需要创建一个Actor和一个调度程序

+0

谢谢,我给第二种方法去了。 – prio