首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Akka中使用Patterns.askWithReplyTo

如何在Akka中使用Patterns.askWithReplyTo
EN

Stack Overflow用户
提问于 2018-10-27 15:52:33
回答 1查看 404关注 0票数 1

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

一个示例项目可以在Github:https://github.com/pcdhan/akka-patterns.git上获得。

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

本地演员

代码语言:javascript
复制
ActorRef localA= system.actorOf(LocalActor.props(), "localA");

一个遥远的演员

代码语言:javascript
复制
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

代码语言:javascript
复制
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());

有效载荷

代码语言:javascript
复制
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;
}

}

远程操作日志

代码语言:javascript
复制
...Actor[akka.tcp://ClusterSystem@localhost:53324/temp/$d]
...Actor[akka.tcp://ClusterSystem@localhost:53324/temp/$e]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-08 13:25:02

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

askWithReplyTo希望您为它提供一个工厂函数,该函数将得到临时响应参与者的信息,因此,如果您有一条消息,您可以这样构造:

new MyMessage(ActorRef replyTo)

您可以像这样在askWithReplyTo中使用它:

代码语言:javascript
复制
final Future<Object> f = Patterns.askWithReplyTo(
  otherActor,
  replyTo -> new MyMessage(replyTo),
  timeout);

第二个参数是lambda,它将使用临时ask调用(当您请求处理响应超时时总是会创建它),这样您就可以将它包含在消息中。

只有当接收方使用该replyTo字段进行响应,而不是使用sender()时,模式才会有用,而这正是您通常要做的响应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53023682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档