当演员完成时Akka跟踪

时间:2012-11-08 22:30:03

标签: scala akka

我有以下代码遍历一个人列表,并在class1中为每个人调用一个回调。

def syncPeople(callback: Person => _) = Future {
   person.findAll(criteria).foldLeft(0L) { (count, obj) =>
      callback(obj)
      count + 1
   } 
}

回调和对syncPeople的调用在class2中,看起来与此类似

def getActor(person: Person):ActorRef = {
  if(person.isMale) maleActor
  else femaleActor
}

def process(person: Person): Unit = {
   val workActor = getActor(person)
   workActor ! person
} //The actor does the actual work and may be quite intense

def syncPeople(process)

现在,我想跟踪同步所有人的总时间。即最后一个workActor完成工作时。我正在使用第三个Actor:MonitorActor来跟踪开始和结束时间。 MaleActor,FemaleActor可以在处理个人时发送消息

跟踪这个衍生过程的最佳方法是什么?

我探索了

  1. Future.sequence //但发送workActor的类消息不是actor。所以未来不会收到消息

  2. 在完成后跟踪personId,但没有使用var,在MonitorActor中累积收到的消息,它不可能实现这个......并且使用var不是首选的做事方式

  3. 实施此

    的其他方法可能是什么

2 个答案:

答案 0 :(得分:4)

很有趣,我现在正在研究一个非常类似的问题。我建议的解决方案是使用跟踪状态的akka-fsm

基本上在你的状态对象之外的某些东西上,做一些像生成一个表示id的长颜词:

def getId(): Long = System.currentTimeMillis() / 1000L

正确实现时的状态对象是不可变的,因此您只需在整个事务中重复使用此ID。

我知道这个答案缺少很多实现细节,但我仍然在自己的代码中自行完成实现。希望在阅读了有关akka-fsm并使用它之后,这个答案会有意义吗?

答案 1 :(得分:1)

不要妖魔化可变状态,它是SHARED可变状态,导致大多数问题。你在actor中没有共享的可变状态,因为你总是和actorRefs交谈,并且actor一次只处理一条消息(没有竞争条件和其他邪恶的东西)。我所说的是,可以使用var(除非你在actor中产生一些未来,它会改变var,因为那时你会回到SHARING可变状态)。 FSM是另一种解决方案,正如@devnulled所建议的那样,但听起来更像是对你的用例来说太过分了。