我正在 lift 中编写一个 cometd 应用程序,我的一些 actor 引用了其他 actor,例如,用户 A 的 actor B 具有一个存储与用户 D 关联的 actor C 的变量。
A 的某些用户操作应导致其参与者 B 向参与者 C 发送消息。
这些事情是由用户A触发的。
我的问题是,是否可以在参与者 B 上调用常规方法,从而导致它向 C 发送消息,或者我应该向 A 发送一条消息,A 接收到该消息,然后将消息发送给 B。
把它写成代码,这样的事情可以吗:
//in some snippet:
val actorB: ActorB = session.map(.findCometActor(...))
"#some-button" #> SHtml.ajaxInvoke(() => actorB.sendIt(777)) //is this ok?
//the actors:
case class MyMessage(someInt: Int, someString: String)
class ActorB extends CometActor {
private var someString = ""
private var otherActor: Box[CometActor] = Empty
def sendIt(someInt: Int) = otherActor ! MyMessage(someInt, someString)
}
class ActorC extends CometActor {
def lowPriority = {
case MyMessage(num, str) => println(num + str)
}
}
或者片段代码应该向参与者 B 发送消息,然后参与者 B 向参与者 C 发送消息,而不是直接调用 actorB.sendIt(777)
?
编辑:只是为了确认,这样做没有技术问题,更多的是关于风格,并希望更容易使代码正确。是这样吗?
最佳答案
参与者模型最关键的特征之一是,每条传入消息的处理都会自动更新参与者状态。如果您直接调用方法,这种原子性将被破坏,您将面临很大的复杂性,例如自己处理协调或使用显式锁。
关于scala - 使用 Actor 时将普通方法调用与消息混合在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657751/