【问题标题】:How to use Patterns.askWithReplyTo in Akka Java如何在 Akka Java 中使用 Patterns.askWithReplyTo
【发布时间】:2018-10-27 15:52:33
【问题描述】:

我正在寻找一个如何通过 Java 使用 Akka 的模式 Patterns.askWithReplyTo 的示例。

Github 上有一个示例项目:https://github.com/pcdhan/akka-patterns.git

我的挑战是我无法在有效负载中包含发件人的 ActorRef。

本地演员

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

远程 Actor

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) 一起发送到远程 Actor

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,但我得到 /temp/$d

【问题讨论】:

    标签: java akka akka-cluster


    【解决方案1】:

    askWithReplyTo 并不意味着将发送参与者self 传递到消息中。

    askWithReplyTo 期望你给它一个工厂函数,它会被提供给临时响应参与者,所以如果你有一条消息,你可以像这样构造:

    new MyMessage(ActorRef replyTo)

    你可以像这样使用askWithReplyTo

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

    第二个参数是一个 lambda,它会被临时 ask-actor 调用(它总是在你请求处理响应超时时创建),以便你可以将它包含在消息中。

    该模式仅在接收方使用 replyTo 字段来响应而不是 sender() 时有用,这是您通常会做的响应。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多