Sockets と Browser Plugin を介して行われるすべての魔法。
設計: アウト プロセス ホスト モード (OOPHM)
これが本質的な部分です。
次の GWT コードを検討してください。
public class MyEntryPoint implements EntryPoint {
private static native int jsniMethod() /*-{
return 1;
}-*/;
public void onModuleLoad() {
jsniMethod();
}
}
JavaScript : ブラウザー プラグインは、モジュール名を含む LoadModuleMessage を送信します。
Java : ホスト モード サーバーは LoadModuleMessage を受信し、モジュールをロードして、対応する EntryPoints で onModuleLoad を呼び出します。この場合、 MyEntryPoint::onModuleLoad が呼び出されます。MyEntryPoint がコンパイルされると、LoadJsniMessage が送信されて各 JSNI メソッドのブラウザ側 JavaScript 関数が作成されます。次に、onModuleLoad が jsniMethod を呼び出すと、InvokeMessage が送信されます。
JavaScript : これは、この例の重要な部分です。JavaScript エンジンは現在、送信した LoadModuleMessage からの戻りを待っていますが、同じスレッドで MyEntryPoint::jsniMethod への呼び出しを呼び出す位置にある必要があります。これは、すべてのリモート呼び出しに続いて、スレッドが読み取りおよびディスパッチ ルーチンに入るようにすることによって実現されます。この場合、スレッドは LoadJsniMessage および InvokeMessage メッセージを受信し、jsniMethod を呼び出して、値 1 を含む ReturnMessage を送信します。
Java : read-and-dispatch ルーチンは ReturnMessage を受け取り、jsniMethod への呼び出しから戻ることを認識します。onModuleLoad メソッドを完全に実行すると、ReturnMessage が送信され、最上位の読み取りとディスパッチのループに戻ります。(すべての呼び出しはブラウザーの UI イベントのディスパッチから発生するため、ホスト モードのサーバーのみがアイドル時間中に読み取りとディスパッチのルーチンにとどまる必要があります。ブラウザーは、最初に呼び出された JavaScript 関数を終了することによって制御を返すだけです。)