Rhino: как создать контекст без привязки потоков - PullRequest
0 голосов
/ 14 октября 2018

Как можно (если есть способ) запустить контекст без привязки к текущему потоку?Я имею в виду, что на самом деле я делаю интеграцию с Akka, у меня есть способы гарантировать сходство потоков с актерами Akka, но я хотел бы уменьшить количество потоков, но при этом я теряю сходство потоков с потерей контекста Rhino.Просто для пояснения, каждый актер будет содержать контекст, который будет отвечать за ответы на запросы, которые будут выполняться против скомпилированного кода Rhino (который скомпилирован в preStart из-за повторного использования кода).

Предположим, у меня есть такой кодthis:

class ScriptActor(script: String) extends Actor {
  var scriptContext: Context = _
  var scriptScope: Scriptable = _

  override def receive: Receive = {
    case ScriptActor.Run(env) =>
      // 2: Here context's of current thread is asked with Context.getCurrentContext()
      val func: RhinoFunction = scriptScope.get("$run", scriptScope)
        .asInstanceOf[RhinoFunction]

      val result = func.call(scriptContext, scriptScope, scriptScope, Array(env.noSpaces, signaler))

      println(result)
  }


  override def postStop(): Unit = {
    Context.exit()

    super.postStop()
  }

  override def preStart(): Unit = {
    // 1: Here context is bound to the actual thread
    scriptContext = Context.enter()

    scriptContext.setOptimizationLevel(-1)
    scriptContext.setLanguageVersion(Context.VERSION_ES6)

    scriptScope = scriptContext.initStandardObjects()

    super.preStart()
  }
}

Edit:

Нашел "способ" сохранения фабрики контекста, а затем factory.enterContext(scriptContext), но я не думаю, что это хороший способ, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...