送信息
消息通过以下方法之一发送给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);
这个例子ask
与pipeTo
期货模式一起演示,因为这可能是一个常见的组合。请注意,以上所有内容都是完全非阻塞和异步的:使用and 方法ask
生成一个Future
,其中两个使用and 方法组成一个新的未来,然后在将来安装一个处理程序,以便将聚合提交给另一个actor 。Futures.sequence
map
pipe
onComplete
Result
使用ask
将向接收角色发送消息tell
,并且接收角色必须回复以完成返回的值。该操作涉及创建一个内部参与者来处理这个回复,为了不泄漏资源,需要有一个超时后才会被销毁。请参阅下文。getSender().tell(reply, getSelf())
Future
ask
该对象中提供了ask
返回CompletionStage
一个Scala 模式的变体,而不是Scala 。Future
akka.pattern.PatternsCS
为了完成将来的例外,您需要向akka.actor.Status.Failure
发件人发送邮件。当一个actor在处理一个消息时抛出一个异常时,这不会自动完成。
请注意,Scala的Try
子类型scala.util.Failure
并scala.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; }
如果参与者未完成未来,它将在超时期限后过期,并指定为该方法的参数; 这将完成一个。ask
Future
AskTimeoutException
有关如何等待或查询未来的更多信息,请参阅期货。
的onComplete
,onSuccess
或onFailure
方法Future
可以用来注册一个回调,当未来完成,给你一个方法,以避免阻塞得到通知。