2016-09-23 68 views
3

我想结合使用SWT和Akka。其中一个SWT小部件是Browser,它嵌入了一个Web浏览器,并允许JS代码通过BrowserFunction对象中的回调函数调用JVM代码。Akka:从回调中发送消息给自己是否安全?

我有以下代码:

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

是否有与演员发送消息给自身内部这些回调的一个什么风险吗?

回答

4

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

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

+0

我认为这里要解决的更重要的问题是他所做的是“超过”演员的状态。如果回调在不同的线程上发生,并且访问内部可变状态,则可能会打破整个假设,即在任何给定时间只有一个线程可以穿过演员 –

相关问题