2015-08-06 2 views
-1

Каждый учебник Akka и его бабушка с гордостью демонстрируют фрагменты кода, как показано ниже, демонстрируя, как выполнять асинхронный, неблокирующий ask через Akka Futures:Реализация шаблона Ask на стороне получателя на земле Akka-Java

// Groovy pseudo code 
class Fizz extends UntypedActor { 
    ActorRef buzz 

    Fizz(ActorRef buzz) { 
     super() 

     this.buzz = buzz 
    } 

    @Override 
    void onReceive(Object message) { 
     if(message instanceof DoSomething) { 
      DoSomething ds = message as DoSomething 
      Foo foo = doSomething(ds) 
      Future<BuzzResult> buzzFut = buzz.ask(new ProcessResult(foo)) 

      buzzFut.onSuccess(new BuzzResultHandler(), system.dispatcher) 
     } 
    } 

    Foo doSomething(DoSomething ds) { … } 
} 

Но нигде я могу на самом деле найти фрагмент кода, который показывает, как обслуживания этого ask на других (получатель) сторонах. Итак, Fizz имеет ask ed Buzz с сообщением ProcessResult, и создал обработчик onSuccess, чтобы получить результат один раз Buzz отправил его обратно. Но как Buzz действительно отправить его обратно?!?

Buzz является актером, и поэтому он делает все свои сообщения через onReceive:

class Buzz extends UntypedActor { 
    @Override 
    void onReceive(Object message) { 
     if(message instanceof ProcessResult) { 
      ProcessResult pr = message as ProcessResult 

      BuzzResult br = BuzzResultFactory.createBuzzResult(pr) 

      // Oh snap, I can’t send ‘br’ back to the Fizz’s BuzzResultHandler 
      // because I return void… 
     } 
    } 
} 

Если onReceive возвращает void, как он может когда-нибудь, возможно, возвращающие результат, когда ask изд-то по Fizz (или другой актер)?!?

Конечно, я приветствую и я чрезвычайно признательна любые ответы, даже в Scala, но будет просить какие-либо фрагменты кода, чтобы быть в Java, так как Scala выглядит иероглифами для меня.

+0

Почему нисходящее объяснение отсутствует? В некоторых местах это называется хитом. Этот вопрос уникален, отвечает, показывает исследования и является [SSCCE] (http://sscce.org). Отправляй меня, дьявол! – smeeb

+0

Для тех из вас, кто хотел бы ударить и запустить: перед тем, как вы это сделаете, пожалуйста, проявите смелость принять эту решимость: пожалуйста, найдите точное место в документации Akka, в которой объясняется, как запросы 'ask' обратно на' отправителя' автоматически отображается в «Будущее», указанном в запрашивающем (вызывающем) актере? ** Это не объясняется нигде в документации. ** Поэтому, пожалуйста, подумайте дважды, прежде чем загружать это. Если вы спросите меня, этот вопрос следует добавить к документам Akka, а не избегать и ниспровергать. – smeeb

+0

И, если человек, который держит это в порядке, это Бакстер, то, по крайней мере, хватит смелости говорить. Кора дважды, если вы в Милуоки. – smeeb

ответ

2

Это довольно простой на самом деле.

Вы просто ответить отправителю:

sender().tell(yourResponse) 

Поскольку вы используете ASK-шаблон, этот ответ не будет получен фактический инициатор аск, а по onSuccessHandler.

+0

О, мой ... Акка, ты так задумался :-) – smeeb

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