scala - 使用 Actor 时将普通方法调用与消息混合在一起?

标签 scala lift actor

我正在 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/

相关文章:

javascript - 从 lift snippet 中获取 d3 中的 json 数据

forms - 使用 liftweb 预填充表单数据

c# - 如何确保奥尔良 Cereal 的一致性?

scala - 如何在 akka 中使用 "ask"作为三个值

scala - 使用 Parboiled 提取双引号字符串内容

python - 如何在 Pyspark 中使用 Scala 类

linux - 为什么 SBT 0.7.7 在我的 Linux 系统上不能正常工作? (案例详情在里面)

scala - Scala Actor 中的 Thread.sleep

scala - Akka future - 并行与并发?

scala Seq sortWith 或 sortBy 与 NaN