2016-08-11 4 views
1

今日、ScriptContextを使用して、複数のスレッドにまたがって使用される単一のナッシュエンジンを使用してスレッドセーフティを作成しましたが、各コンテキストはベースのJSライブラリを評価する必要があるため、SimpleScriptContextの複製/コピー

すでにいくつかの基本バインディングがあり、一度コピーされると、スレッドセーフティを維持しながら、追加のバインディングを追加するScriptContext(SimpleScriptContext)をコピー/クローンする方法はありますか?

または、Bindingsをクローン/コピーしてcontext.setBindings()を使用するなど、パフォーマンスを向上させるために別の方法がありますか?または、Bindingsオブジェクトの基礎となるマップを複製/コピーし、SimpleBindings(map)コンストラクタを使用しますか?

+0

SimpleBindingsコピーコンストラクタを使用して既存のBindingsおよびuse context.setBindingsから開始しようとしましたが、結果はスレッドセーフではありませんでした。 – Aaron

+0

SimpleBindingsにコピーコンストラクタがありません。これは、マッピングを格納するために渡したマップインスタンスを使用するだけです。効果的にコピーしません。 – NishM

答えて

0

各実行前にバインディングをコピーし、グローバルコンテキストに追加してからScriptEngineに追加することができます。これは、すべてのJavaScriptの実行に必要な共通マッピングを持つバインディングのグローバルコピーが必要であることを意味します。これらのバインディングは、ローカルマッピングがグローバルバインディング内のマッピングに干渉しないように、実行の前にコンテキストエンジンの組み合わせでコピーされ使用されます。

Nashorn ScriptEngineはスレッドセーフではないため、すべてのスレッドを1つのエンジンで処理することはできません。スレッドごとに1つのエンジンを使用することをお勧めします。

ScriptEngineが実際にスレッドセーフであると言うスタックオーバーフローポストがありますが、コールごとにバインディングを持つ1つのエンジンを使用している間に深刻なクロストークの問題に直面しています。

Bindings.copyAll()はJavaScriptオブジェクト間の一貫した動作を保証しません。 JavaScriptコードの中に、コピーされたマッピングの一部であるオブジェクトをJSON.stringifyingする際に問題が発生する可能性があります。

EDIT:@DennisKrøgerのコメントからこの答えに、クロストークを克服するためにBindingsの代わりにScriptContextインスタンスを使用する必要があります。

+1

Nashorn ScriptEngineはスレッドセーフであり、私の経験ではスレッドセーフでなければなりません。バインディングが設定されたコンテキストではなく、直接バインディングを使用したことがあります。 これは少なくとも私がやったことであり、私は文脈を使って切り替えるまでひどいスレッドの問題を抱えていました。 –

+0

@DennisKrøgerありがとうございますが残念ながら、私たちは文脈を使って行かなければならないことに気がつきました。今のところ、いくつかのオブジェクトをThreadLocalとして宣言することによって、スレッドセーフな問題を克服しています。長期的かつ恒久的な修正は、代わりにコンテキストを操作することです。 – NishM

関連する問題