簡體   English   中英

如何在 Akka Java 中使用 Patterns.askWithReplyTo

[英]How to use Patterns.askWithReplyTo in Akka Java

我正在尋找如何使用 Java 使用 Akka 模式Patterns.askWithReplyTo的示例。

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) 一起發送到遠程 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[akka.tcp://ClusterSystem@localhost:53324/temp/$d]
...Actor[akka.tcp://ClusterSystem@localhost:53324/temp/$e]

我期望 .../user/localA,但我得到 /temp/$d

askWithReplyTo並不意味着將發送者self傳遞到消息中。

askWithReplyTo期望你給它一個工廠函數,它被喂給臨時響應actor,所以如果你有一個可以像這樣構造的消息:

new MyMessage(ActorRef replyTo)

您可以像這樣將其與askWithReplyTo一起使用:

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

第二個參數是一個 lambda,它將與臨時 ask-actor 一起調用(它總是在您要求處理響應超時時創建),以便您可以將它包含在消息中。

該模式僅在接收方使用該replyTo字段進行響應而不是sender()時才有用,這是您通常用來響應的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM