我有以下代码遍历一个人列表,并在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可以在处理个人时发送消息
跟踪这个衍生过程的最佳方法是什么?
我探索了
Future.sequence //但发送workActor的类消息不是actor。所以未来不会收到消息
在完成后跟踪personId,但没有使用var,在MonitorActor中累积收到的消息,它不可能实现这个......并且使用var不是首选的做事方式
实施此
的其他方法可能是什么答案 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所建议的那样,但听起来更像是对你的用例来说太过分了。