1

Rubyでjavascriptを評価しようとしています。

config/initializer/initializer_context.rb
  js_str = 
  EXEC_PP_CONTEXT = ExecJS.compile("function test_add(param) { return param.a+ param.b;}")

そして、コントローラーで使用しています:

data_hash = {:a=>4,:b=>5}
EXEC_PP_CONTEXT.exec("return test_add(#{data_hash.to_json})")

しかし、時々このエラーが発生します(100リクエストに1回)

can not use Context instance already associated with some thread

スタック:

  • ruby 1.9 モードの jruby-1.7.3
  • jruby_min_runtimes と jruby_min_runtimes が 1 のトリニダード サーバー
  • レール3.2.13
  • テルビリノ 2.0.2

すでに最大ランタイムと最小ランタイムを 1 に設定している場合、そもそもこの問題を回避すべきではありませんか?

4

1 に答える 1

0

最終的に Mozilla rhino のコードを読んで理解しました: https://github.com/matthieu/rhymeno/blob/master/src/org/mozilla/javascript/Context.java#LC416

static final Context enter(Context cx, ContextFactory factory)基本的に、メソッドはコンテキスト内にあるスレッドの数をカウントし (使用/実行)、別のスレッドがコンテキストに入ろうとすると、エラーがスローされます。

問題を回避して並行性を実現するために、Ruby を使用してスレッドごとに 1 つのコンテキストを遅延して作成しました。Thread[:current][:some_js_context] = blah_

于 2015-02-24T07:31:38.503 に答える