我正在写一个彗星应用程序,我的一些演员有其他演员的引用,例如用户A有演员B,它有一个变量存储演员C,与用户D相关联。
A的一些用户操作应该导致他们的演员B向演员C发送消息。
这些事情由用户A触发。
我的问题是,是否可以在actor B上调用常规方法,这会导致它向C发送消息,或者我应该将消息发送给它接收的A,然后将消息发送给B. / p>
把它放在代码中,这样的事情还可以:
//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)
?
编辑:只是为了确认,这样做没有任何技术问题,它更多的是关于样式,并希望更容易使代码更正。是吗?
答案 0 :(得分:4)
actor模型最关键的特性之一是,每个传入消息的处理都会更新actor atomically 。如果你直接调用一个方法,这个原子性就会被打破,你将面临很大的复杂问题,比如自己处理协调或使用显式锁。
答案 1 :(得分:1)
不要直接调用它 - 即使它看起来不错,这实际上并不是这样。如果你要访问someString
,你应该用锁来保护它,但事实并非如此。
通常,Actors使用Actor范例。它保留在使代码易于推理的范例中......这并不容易推理,并且随着它变得越来越复杂,它将变得更糟。向B发送消息,告诉B向C发送消息,如您所示。