在等待新消息时仍然有效的Akka演员?

时间:2011-12-29 16:10:52

标签: java actor akka

我是Akka的新手,如果这是一个基本问题,我会提前道歉。我不确定如何使用actor来实现以下场景,或者它是否可能(或者是可取的)。

  • 我有许多参与者(即生产者)负责同时维护某些状态,所有这些都会在发生变化时通知另一个参与者(即消费者)。
  • 消费者要反复运行某个任务,这个任务需要所有生产者的状态才能启动。它还必须在收到来自生产者的消息时响应状态的变化。

在考虑Akka之前,我会推出自己的简单actor模型,每个actor都在自己的线程中运行。 run()方法会监视一个事件队列,所以我可以让消费者继续做类似的事情:

while not done
    poll the event queue
    if something was polled
        process the event
    if all state is available
        do one step of the long running task

对事件队列的持续轮询并不适合我,但它至少在事件之间的长期任务上取得了进展。

有没有最好的方法来使用Akka演员实现这个?我可以实现一个“心跳”,它向消费者发送消息(或者自己内部发送给消费者)再做另一个长时间运行任务的一步,但我不喜欢安排它的想法,因为长时间运行任务中的步骤持续时间不一致。我不想排队使其过于繁忙的迭代,以免快速响应来自生产者的消息。但我也不想太频繁地安排它,所以当它可能取得进展时它会闲置......

或者更适合使用Dataflow的并发模型(我只准备好了)?消费者无法启动,直到状态全部被绑定,所以它根据数据流变量定义过程似乎很自然。但是,如果Dataflow变量只能绑定一次,那么从消费者那里获得状态的重复更新似乎不合适。

1 个答案:

答案 0 :(得分:2)

您可以让产品将更改发布到Akka EventBus,让消费者注册以监听这些事件,然后当它满足所有需要时,它可以处理完整的块,或者产生一个新的处理完整块的actor。