2015-04-08 5 views
1

У меня есть 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.

Спасибо за помощь!

+0

Можете ли вы опубликовать код двух подзаголовков? Кроме того, я предполагаю, что вы не получаете сообщение B, правильно? Какое сообщение отправляется в DeadLetters (от основного до a, от main до b, a до основного или b до основного)? –

+0

@DiegoMartinoia, я добавил SubActors. DeadLetters происходит по пути от MainActor к любому другому актеру, я возвращаю результат. –

+0

Одна непосредственная потенциальная проблема, которую я вижу, заключается в том, что вы (возможно) не отправляете MessageResponseX из ни A, ни B в основную: вы отправляете MessageResponseX.events + Long. В соответствии с тем, что оператор + работает с вашими событиями, вы, вероятно, отправляете либо Long, String, либо коллекцию Long/Object –

ответ

2

Похоже, что вы фактически не возвращаете MessageResponseX из A или B в основной: вы отправляете MessageResponseX.events + Long. В соответствии с тем, что оператор + работает с вашими событиями, вы, вероятно, отправляете Long, String или коллекцию Long/Object.

Поэтому ваш метод приема MainActor не перехватывает его, и он переходит к DeadLetters.

Смежные вопросы