Jruby线程上下文实例关联

时间:2015-02-20 05:28:20

标签: ruby-on-rails ruby jruby threadcontext

我正在尝试在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

堆栈:

  • jruby-1.7.3 in ruby​​ 1.9 mode
  • trinidad服务器,带有jruby_min_runtimes& jruby_min_runtimes as 1
  • rails 3.2.13
  • therubyrhino 2.0.2

如果我已经将max runtime和min runtime设置为1,那么首先应该避免这个问题吗?

1 个答案:

答案 0 :(得分: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的Thread[:current][:some_js_context] = blah_

懒惰地为每个线程创建了一个上下文