2

我对 Actor 模型还很陌生,这就是为什么我认为已经建立了模式来处理我的常见场景,这些模式具有像演员和期货这样美丽的可组合抽象。

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

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

我在 Futures 中考虑:第一个要求可以用例如 Akka 的map/来解决flatMap,第二个要求可以用traverse组合器来解决,而无需在程序上维护依赖项/依赖项。但我想不出取消的解决方案;期货不能被取消,如果组合,它们的组件是不可访问的。如何以函数的方式封装“取消当前操作”?Scala 的任何 Actor 框架是否支持这一点?

4

2 回答 2

3

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

创建一个使用侦听器将轮询状态传播到任何和所有侦听器的 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
  }
}

然后,您可以使用 stop 或发送 PoisonPill 来停止 actor。

这有帮助吗?

于 2011-08-31T10:14:52.690 回答
0

Guava 的ListenableFuture支持在绑定在一起时取消到某个级别(但不是从集合中组合时)。

于 2012-01-17T15:22:53.967 回答