如何与actor实现异步相互依赖的可取消操作?

时间:2011-08-31 09:17:45

标签: future actor cancellation

我对Actor模型很陌生,这就是为什么我认为已经建立的模式可以解决我看似常见的场景,其中有如演员和未来这样漂亮的可组合抽象。

我有以下要求的异步操作:

  • 他们通过发送低级请求然后使用轮询监视实体的状态来使用遗留系统。因此,实际操作的结果只能以延迟方式提供,当观察到的状态达到所需状态时,必须通知请求者。
  • 只有在完成其他一些操作后才能发出这些操作,并且它们应该并行等待。
  • 可以取消操作。当然,已发布的低级请求无法撤消;取消意味着在我们依赖完成的操作之后不发出实际操作,当然这必须以递归方式传播(如果我们等待依赖,并且它有多个挂起操作,则不发出它们)。 / LI>

我正在考虑期货:第一个要求可以用例如Akka的map / flatMap,第二个与traverse组合子没有在程序上维护依赖/依赖。但我想不出取消的解决方案;期货不能被取消,如果组成,它们的组件是不可达的。如何以功能方式封装“取消当前操作”? Scala的任何Actor框架都支持这个吗?

2 个答案:

答案 0 :(得分:3)

使用听众:https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

创建一个使用Listeners的Actor将轮询状态传播给任何和所有侦听器。然后,您可以使用消息传递循环重新启动轮询。

class MyActor extends Actor with Listeners {

  override def preStart {
    self ! 'poll //Start looping on start
  }

  def receive = listenerManagement orElse {
    case 'poll => val result = pollYourExternalDude()
    gossip(result)
    self ! 'poll //Loop
  }
}

然后您可以使用停止或发送PoisonPill来停止演员。

这有帮助吗?

答案 1 :(得分:0)

Guava的ListenableFuture支持取消bound together时的某个级别(但不是combined from a collection时)。