tell ask

送信息

消息通过以下方法之一发送给Actor。

  • tell 意味着“即忘即忘”,例如异步发送消息并立即返回。
  • ask异步发送消息并返回Future代表可能的答复。

邮件排序是基于每个发件人的基础上保证的。

注意

ask由于某些东西需要跟踪其超时时间,因此存在性能方面的影响,需要将某些东西连接Promise成一个ActorRef,并且还需要通过远程处理才能访问。所以总是喜欢tell表现,而且只有ask在你必须的时候。

在所有这些方法中,您可以选择传递自己的方法ActorRef使其成为这样做的做法,因为它将允许接收方参与者能够响应您的消息,因为发送者参考与消息一起发送。

告诉:忘了火

这是发送消息的首选方式。没有阻塞等待消息。这提供了最佳的并发性和可伸缩性特征。

斯卡拉 Java的
// don’t forget to think about who is the sender (2nd argument)
target.tell(message, getSelf());

getSender()在处理此消息时,发件人引用会与消息一起传递,并在接收方中通过其方法提供。在演员内部,通常是getSelf()谁是发送者,但可能会有回复被路由给其他演员的情况 - 例如,父母 - 其中第二个参数tell将是另一个演员在演员之外,如果不需要回复,第二个参数可以是null如果在演员之外需要回复,则可以使用下面描述的问答模式..

问:发送和接收未来

ask模式涉及演员和期货,因此它作为使用模式而不是以下方法提供ActorRef

斯卡拉 Java的
import static akka.pattern.PatternsCS.ask;
import static akka.pattern.PatternsCS.pipe;

import java.util.concurrent.CompletableFuture;
Timeout t = new Timeout(Duration.create(5, TimeUnit.SECONDS));

// using 1000ms timeout
CompletableFuture<Object> future1 =
  ask(actorA, "request", 1000).toCompletableFuture();

// using timeout from above
CompletableFuture<Object> future2 =
  ask(actorB, "another request", t).toCompletableFuture();

CompletableFuture<Result> transformed =
  CompletableFuture.allOf(future1, future2)
  .thenApply(v -> {
    String x = (String) future1.join();
    String s = (String) future2.join();
    return new Result(x, s);
  });

pipe(transformed, system.dispatcher()).to(actorC);

这个例子askpipeTo期货模式一起演示,因为这可能是一个常见的组合。请注意,以上所有内容都是完全非阻塞和异步的:使用and 方法ask生成一个Future,其中两个使用and 方法组成一个新的未来,然后在将来安装一个处理程序,以便将聚合提交给另一个actor 。Futures.sequencemappipeonCompleteResult

使用ask将向接收角色发送消息tell,并且接收角色必须回复以完成返回的值。操作涉及创建一个内部参与者来处理这个回复,为了不泄漏资源,需要有一个超时后才会被销毁。请参阅下文。getSender().tell(reply, getSelf()) Futureask

注意

对象中提供了ask返回CompletionStage一个Scala 模式的变体,而不是Scala Futureakka.pattern.PatternsCS

警告

为了完成将来的例外,您需要向akka.actor.Status.Failure发件人发送邮件。当一个actor在处理一个消息时抛出一个异常时,不会自动完成

请注意,Scala的Try子类型scala.util.Failurescala.util.Success没有专门处理,并且会使用给定的值完成问题Future - 只有akka.actor.Status消息被ask模式特别处理。

斯卡拉 Java的
try {
  String result = operation();
  getSender().tell(result, getSelf());
} catch (Exception e) {
  getSender().tell(new akka.actor.Status.Failure(e), getSelf());
  throw e;
}

如果参与者未完成未来,它将在超时期限后过期,并指定为该方法的参数这将完成一个askFutureAskTimeoutException

有关如何等待或查询未来的更多信息,请参阅期货

onCompleteonSuccessonFailure方法Future可以用来注册一个回调,当未来完成,给你一个方法,以避免阻塞得到通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值