У меня есть MainActor
, который внутри конструктора инициализирует двоих детей SubActorA
и SubActorB
.Обнаружены мертвые буквы Akka
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
он посылает его к двум его Чайлдс 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())
}
}
Таким образом, вы можете видеть, что два сообщения были отправлены каждому из суб-субъектов. Но, к сожалению, я получаю только одно сообщение назад и около INFO
уведомление о DeadLetter
. Message was not delivered. [1] dead letters encountered.
Не могли бы вы помочь мне найти, почему я не получаю 2-е сообщение? это как-то связано с закрытием актера, но я останавливаю его только на самом низком уровне внутри Subactors
.
Спасибо за помощь!
Можете ли вы опубликовать код двух подзаголовков? Кроме того, я предполагаю, что вы не получаете сообщение B, правильно? Какое сообщение отправляется в DeadLetters (от основного до a, от main до b, a до основного или b до основного)? –
@DiegoMartinoia, я добавил SubActors. DeadLetters происходит по пути от MainActor к любому другому актеру, я возвращаю результат. –
Одна непосредственная потенциальная проблема, которую я вижу, заключается в том, что вы (возможно) не отправляете MessageResponseX из ни A, ни B в основную: вы отправляете MessageResponseX.events + Long. В соответствии с тем, что оператор + работает с вашими событиями, вы, вероятно, отправляете либо Long, String, либо коллекцию Long/Object –