scala - Akka:从回调中向自己发送消息是否安全?

标签 scala swt akka

我正在尝试将 SWT 的使用与 Akka 结合起来。其中一个 SWT 小部件是 Browser,它嵌入了 Web 浏览器,并允许 JS 代码通过 BrowserFunction 对象中的回调函数调用 JVM 代码。

我有以下代码:

import org.eclipse.swt.widgets.Composite
import org.eclipse.swt.browser._
import akka.actor.Actor

class MyActor(parentComposite: Composite) extends Actor {
  private var mutableContent: Any = ???

  val browser = new Browser(parentComposite, SWT.BORDER)

  val browserFunction = new BrowserFunction(browser, "JS_CallableFunctionName") {
    val ref = context.self
    override def function(arguments: Array[Object]): Object = {
      ref ! "Is it safe to send a message to myself?"
      null
    }
  }

  def receive = {
    case _ => ???
  }
}

参与者在其中一个回调中向自己发送消息是否有任何风险?

最佳答案

actor 向自己发送消息应该没有问题。本质上,这只是将消息添加到 Actor 的邮箱中, Actor 稍后会对其进行处理。当您将参与者的内部变量或状态暴露给外界时,就会出现问题。例如,如果您的 browserFunction 将返回“mutableContent”,但情况并非如此,就会发生这种情况。

话虽如此,在我看来更好的方法是从浏览器中单独创建 Actor,然后将其 ActorRef 安全地传递给 BrowserFunction(也在 Actor 外部创建)。通过这样做,您可以确保您永远不会与在 actor 循环外执行的任何回调共享 actor 的内部状态。任何通信都将通过 Actor 的消息进行。

关于scala - Akka:从回调中向自己发送消息是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666794/

相关文章:

scala - 从不重新计算相同的部分评估两次的意义上说,部分函数应用程序可以是惰性的吗?

java - 需要刷新 Java EDT(事件调度队列)

swt - 在 SWT 中更改组小部件标题颜色

java - 如何使用 SWT 访问网络摄像头

scala - 使用 uberjar 部署时覆盖 Typesafe 配置中的多个配置值

scala - 2.10 的嵌入式 Scala REPL 解释器示例

scala - 为什么要将泛型类型放在函数旁边?

scala - F# 和 Scala 中的 ADT

scala - 奇怪的错误消息 : bad symbolic reference. package.class 中的签名指的是包 org 中的术语 apache,该术语不可用

java - Akka SupervisorStrategy 与子进程的关系