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

时间:2016-09-23 17:53:00

标签: 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 _ => ???
  }
}

演员在其中一个回调中向自己发送消息有什么风险吗?

1 个答案:

答案 0 :(得分:5)

演员向自己发送消息时应该没有问题。从本质上讲,这只会将消息添加到演员后来处理的演员邮箱中。当您将actor的内部变量或状态暴露给外部世界时会出现问题。例如,如果您的browserFunction将返回'mutableContent',则不会发生这种情况。

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