2016-09-23 8 views
3

私はSWTとAkkaを組み合わせようとしています。 SWTウィジェットの1つは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 _ => ??? 
    } 
} 

は、これらのコールバックの1の内側に自分自身にメッセージを送信する俳優とのいずれかのリスクがありますか?

答えて

4

アクターが自己にメッセージを送信するときに問題はありません。本質的に、これは、俳優が後で処理する俳優のメールボックスにメッセージを追加するだけです。俳優の内部変数や状態を外部に公開すると、問題が発生します。これは、例えば、あなたのbrowserFunctionが 'mutableContent'を返す場合に起こります。

これは、ブラウザとは別にActorを作成してから、ActorFefをActorFunction(Actorの外でも作成された)に安全に渡すよりよいアプローチだと言われています。こうすることで、アクターのループ外で実行されるコールバックで、アクターの内部状態を決して共有しないようにすることができます。どんなコミュニケーションも、俳優のメッセージを通して起こります。

+0

私はここで取り組むべきより重要な問題は、彼がやっていることが俳優の状態を「クローズアップ」しているかどうかということです。コールバックが内部の可変状態にアクセスする別のスレッドで発生している場合、ある時点で1つのスレッドのみがアクターを実行できるという仮定をすべて破る可能性があります –

関連する問題