我正在尝试使用以下lib版本从“scratch”(读取,“noob”)组合我的第一个Akka / Camel应用程序:
根据我能找到的所有文档(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”行调试期间中断(更不用说如果我明确地“告诉”它处理好的事情),它即使我有另一个应用程序向同一端点发送消息,也不会从定义的端点消耗。
知道我做错了吗?
答案 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中的例子。