Как использовать Patterns.askWithReplyTo в Akka Java - PullRequest
0 голосов
/ 27 октября 2018

Я ищу пример использования шаблона Akka Patterns.askWithReplyTo с использованием Java.

Образец проекта доступен на Github: https://github.com/pcdhan/akka-patterns.git

Моя задача заключается в том, что я не могувключить ActorRef отправителя в полезную нагрузку.

Локальный субъект

ActorRef localA= system.actorOf(LocalActor.props(), "localA");

Удаленный субъект

Timeout timeout = new Timeout(10000, TimeUnit.MILLISECONDS);
ActorSelection actorSelection=system.actorSelection("akka.tcp://ClusterSystem@localhost:2551/user/ActorA");
Future<Object> future = Patterns.ask(actorSelection, new Identify(""), timeout);
ActorIdentity reply = (ActorIdentity) Await.result(future, timeout.duration());
ActorRef actorRef = reply.ref().get(); //my remote actor ref

Отправить полезную нагрузку на удаленный субъект вместе с ActorRef (localA)

Payload payload = new Payload(); //How do I pass localA here
payload.setMsg("0");
Future<Object> askWithSenderRef = 
Patterns.askWithReplyTo(actorRef,payload,20000L);
Payload responsePayload = (Payload) Await.result(askWithSenderRef, 
timeout.duration());
System.out.println("Response from Remote Actor Payload: "+responsePayload.getMsg());

Полезная нагрузка

public class Payload implements Function<ActorRef, Object>, Serializable {
private static final long serialVersionUID = 1L;

String msg;

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

@Override
public Object apply(ActorRef param) throws Exception {
    return this;
}

}

Удаленные журналы Actor

...Actor[akka.tcp://ClusterSystem@localhost:53324/temp/$d]
...Actor[akka.tcp://ClusterSystem@localhost:53324/temp/$e]

Я ожидаю ... / user / localA, но яget / temp / $ d

1 Ответ

0 голосов
/ 08 ноября 2018

askWithReplyTo не предназначен для передачи отправляющего актера self в сообщение.

askWithReplyTo ожидает, что вы передадите ему фабричную функцию, которая получает фид с временным ответным актором, так что если выу вас есть сообщение, которое вы можете построить так:

new MyMessage(ActorRef replyTo)

Вы можете использовать это с askWithReplyTo, например, так:

final Future<Object> f = Patterns.askWithReplyTo(
  otherActor,
  replyTo -> new MyMessage(replyTo),
  timeout);

Второй параметр - этолямбда, которая будет вызываться временным оператором ask (который всегда создается, когда вы просите позаботиться о времени ожидания ответа), чтобы вы могли включить его в сообщение.

Шаблон полезен только тогда, когда принимающая сторона использует это поле replyTo для ответа, а не sender(), что вы обычно делаете для ответа.

...