Akka / Camel UntypedConsumerActor不从基于文件的队列中消耗

时间:2013-07-01 23:10:12

标签: apache-camel akka

我正在尝试使用以下lib版本从“scratch”(读取,“noob”)组合我的第一个Akka / Camel应用程序:

  • akka-camel:2.2.0-RC1

根据我能找到的所有文档(Akka文档,用户组等),我所要做的就是从基于文件的队列中进行操作,这样就建立了我的系统:

主要课程:

actorSystem = ActorSystem.create("my-system");

Props props = new Props(Supervisor.class);
ActorRef supervisor = actorSystem.actorOf(props, "supervisor");

Camel camel = CamelExtension.get(actorSystem);
CamelContext camelContext = camel.context();
camelContext.start();

主管班:

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.camel.javaapi.UntypedConsumerActor;
import org.apache.camel.Message;

/**
 * Manages creation and supervision of UploadBatchWorkers.
 */
public class Supervisor extends UntypedConsumerActor {    
    @Override
    public String getEndpointUri() {
        return "file:///Users/myhome/queue";
    }

    @Override
    public void preStart() {
        String test = "test";
    }

    @Override
    public void onReceive(Object message) {
        if (message instanceof CamelMessage) {
            // do something
        }
    }

我的问题是,即使我知道正在创建supervisor对象并在preStart()方法的“test”行调试期间中断(更不用说如果我明确地“告诉”它处理好的事情),它即使我有另一个应用程序向同一端点发送消息,也不会从定义的端点消耗。

知道我做错了吗?

2 个答案:

答案 0 :(得分:2)

好的,问题是我自己的错,如果你看一下UntypedConsumerActor继承的Consumer trait,它在示例代码中清晰可见。

此方法:

@Override
public void preStart() {
    String test = "test";
}

覆盖其父级的preStart()方法,对吗?那么,那个父方法实际上就是用即时创建的端点注册消费者的方法,所以当你可以覆盖它时,你必须调用super(),否则它将无效。

希望这对后来的人有用!

答案 1 :(得分:0)

尝试将instanceof内的onReceive更改为:

if (message instanceof CamelMessage){
  //do processing here
}

CamelMessage来自包akka.camel。这就是akka camel docs中的例子。