遇到的akka死信
Akka dead letters encountered
我有 MainActor
,它在构造函数内部初始化了两个 child SubActorA
和 SubActorB
。
SubActorA= this.getContext().actorOf(Props.create(SubActorA.class), "SubActorA");
SubActorB= this.getContext().actorOf(Props.create(SubActorB.class), "SubActorB");
public class SubActorA extends UntypedActor {
@Override
public void onReceive(Object o) throws Exception {
Thread.sleep(3000);
getSender().tell(new MessageResponseA().events + System.currentTimeMillis(), getSelf());
getContext().stop(getSelf());
}
}
public class SubActorB extends UntypedActor {
@Override
public void onReceive(Object o) throws Exception {
Thread.sleep(3000);
getSender().tell(new MessageResponseB().events + System.currentTimeMillis(), getSelf());
getContext().stop(getSelf());
}
}
MainActor
收到来自外部演员世界的 Message
请求:
public Future<Iterable<Object>> start(){
final ArrayList<Future<Object>> futures = new ArrayList<>();
Timeout t = new Timeout(100, TimeUnit.MILLISECONDS);
futures.add(ask(this.mainActor, new Message(customerCookie), t));
final Future<Iterable<Object>> aggregate = Futures.sequence(futures,
system.dispatcher());
return aggregate;
}
一旦 MainActor
收到 Message
,它就会将其发送给它的两个 child SubActorA
和 SubActorB
。
@Override
public void onReceive(Object message) throws Exception {
if(message instanceof `Message`){
generalPersonalisationSender = getSender();
SubActorA.tell(new MessageA(customerCookie), getSelf());
SubActorB.tell(new MessageB(customerCookie), getSelf());
}
else if(message instanceof `MessageResponseA`){
listener.tell(message, getSelf())
}
else if(message instanceof `MessageResponseB`){
listener.tell(message, getSelf())
}
}
所以你可以看到两条消息已经发送给每个子演员。但不幸的是,我只收到一条消息和关于 DeadLetter
的 INFO
通知。 Message was not delivered. [1] dead letters encountered.
你能帮我找出为什么我没有收到第二条消息吗?这与关闭演员有关吗,但我只在最低的内部停止它 Subactors
。
感谢您的帮助!
看来您实际上并没有从 A 或 B 向主要对象返回 MessageResponseX:您发送的是 MessageResponseX.events+Long 。根据 + 运算符如何处理您的事件,您可能发送的是 Long、String 或 Long/Object.
的集合
因此,您的 MainActor 接收方法没有拦截它,它转到死信。
我有 MainActor
,它在构造函数内部初始化了两个 child SubActorA
和 SubActorB
。
SubActorA= this.getContext().actorOf(Props.create(SubActorA.class), "SubActorA");
SubActorB= this.getContext().actorOf(Props.create(SubActorB.class), "SubActorB");
public class SubActorA extends UntypedActor {
@Override
public void onReceive(Object o) throws Exception {
Thread.sleep(3000);
getSender().tell(new MessageResponseA().events + System.currentTimeMillis(), getSelf());
getContext().stop(getSelf());
}
}
public class SubActorB extends UntypedActor {
@Override
public void onReceive(Object o) throws Exception {
Thread.sleep(3000);
getSender().tell(new MessageResponseB().events + System.currentTimeMillis(), getSelf());
getContext().stop(getSelf());
}
}
MainActor
收到来自外部演员世界的 Message
请求:
public Future<Iterable<Object>> start(){
final ArrayList<Future<Object>> futures = new ArrayList<>();
Timeout t = new Timeout(100, TimeUnit.MILLISECONDS);
futures.add(ask(this.mainActor, new Message(customerCookie), t));
final Future<Iterable<Object>> aggregate = Futures.sequence(futures,
system.dispatcher());
return aggregate;
}
一旦 MainActor
收到 Message
,它就会将其发送给它的两个 child SubActorA
和 SubActorB
。
@Override
public void onReceive(Object message) throws Exception {
if(message instanceof `Message`){
generalPersonalisationSender = getSender();
SubActorA.tell(new MessageA(customerCookie), getSelf());
SubActorB.tell(new MessageB(customerCookie), getSelf());
}
else if(message instanceof `MessageResponseA`){
listener.tell(message, getSelf())
}
else if(message instanceof `MessageResponseB`){
listener.tell(message, getSelf())
}
}
所以你可以看到两条消息已经发送给每个子演员。但不幸的是,我只收到一条消息和关于 DeadLetter
的 INFO
通知。 Message was not delivered. [1] dead letters encountered.
你能帮我找出为什么我没有收到第二条消息吗?这与关闭演员有关吗,但我只在最低的内部停止它 Subactors
。
感谢您的帮助!
看来您实际上并没有从 A 或 B 向主要对象返回 MessageResponseX:您发送的是 MessageResponseX.events+Long 。根据 + 运算符如何处理您的事件,您可能发送的是 Long、String 或 Long/Object.
的集合因此,您的 MainActor 接收方法没有拦截它,它转到死信。