Akka 1.3的senderFuture是否有Akka 2.0替代品?

时间:2013-01-08 01:13:07

标签: akka

我有一些Akka 1.3代码处理与外部消息系统的集成,该系统不直接支持回复的概念。我正在尝试将代码库升级到Akka 2.0并遇到麻烦,因为我现有的设计依赖于通过在ConcurrentHashMap中生成密钥并使用senderFuture进行清理来模拟“回复”机制。

发送给处理调度的actor的消息可能会或可能不会期待回复,即使他们期待回复,在通过网络发送之后,他们也可能永远不会得到回复。因此,HashMap应该只存储实际需要回复的消息的条目(询问,而不是告诉),并且它必须具有某种形式的清理机制来清除从未收到回复的条目。

在Akka 1.3中,我通过附加到senderFuture来做到这一点,所以当发送消息的actor超时并放弃回复时,HashMap中的相应条目也会被删除:

if (self.senderFuture().isDefined) {
  pendingRequests.put(replyToKey, sender)
  self.senderFuture().get.onComplete( f => {
    pendingRequests.remove(replyToKey)
  }
}

由于Akka 2.0已删除了对senderFuture的可访问性,是否有一种处理此方案的简洁方法?或者我只是需要从头开始创建清理过程?

1 个答案:

答案 0 :(得分:2)

您正在寻找的精确功能未保留在Akka 2.x中,因为

  • 它使远程演员沟通变得脆弱,
  • 它在沟通中打开了一个非明显的旁道,最好是明确的。

使用senderFuture意味着您已选择清理操作作为客户端actor的责任。您仍然可以通过在发送的邮件中包含此信息来实现此目的,而不是将其放入邮件的发送方式。

要考虑的另一件事是在2.0中添加了DeathWatch功能:您可以发出需要清理的信号,然后目标可以context.watch()请求的发件人,清除相应的{{收到消息(由发送方的消亡触发)。然后客户端仍然可以使用ask pattern并使用适当的超时,这会将定时的利益损失传递给服务主体。