使用JMeter/Java上下文的Scala JSR223脚本

使用JMeter/Java上下文的Scala JSR223脚本,java,scala,jmeter,jsr223,scriptengine,Java,Scala,Jmeter,Jsr223,Scriptengine,我添加了Scala2.13JAR并尝试执行脚本,它可以在响应中显示常量 但我无法将JMeter的绑定变量添加为log,我尝试了: log.info(a); $log.info(a); 或者无法将值打印到日志,也尝试了 var a:Int = 10 println(a) JMeter代码: 还尝试使用绑定,但不在上下文中 bindings.get("log").info("aa"); 例外情况 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR2

我添加了Scala2.13JAR并尝试执行脚本,它可以在响应中显示常量

但我无法将JMeter的绑定变量添加为
log
,我尝试了:

log.info(a);
$log.info(a);
或者无法将值打印到日志,也尝试了

var a:Int =  10
println(a)
JMeter代码:

还尝试使用绑定,但不在上下文中

bindings.get("log").info("aa");
例外情况

ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: not found: value bindings
如何使用JMeter/Java绑定变量提交Scala JSR223脚本

编辑


Open JSR223-引擎忽略绑定参数问题的核心是Scala脚本引擎将注入的绑定视为具有
Any
类型。要使用注入的绑定,您必须在每次使用时将它们强制转换为适当的类型,或者需要将它们作为“影子绑定”注入,然后使用适当的类型在引擎中重新绑定

这是我的
Main.scala
,在这里我演示了后一种方法:

import javax.script.ScriptEngineManager

import org.slf4j.Logger
import org.slf4j.LoggerFactory

object Main extends App {

  val logger: Logger = LoggerFactory.getLogger("main")

  val e = new ScriptEngineManager().getEngineByName("scala")
  e.put("a", 1)
  e.put("s", "String")

  // Since the variable will have a type of Object, inject under a different name, and then bind to the
  // "correct" name using eval.
  e.put("logInjected", logger)

  println(e.eval(""" s"a is $a, s is $s" """))
  println(e.eval(""" logInjected.toString """))

  e.eval(""" val log = logInjected.asInstanceOf[org.slf4j.Logger] """)
  e.eval(""" log.info("hello from injected logger") """)

  e.eval(
    """ // Or can you do this
      | import org.slf4j.Logger
      | import org.slf4j.LoggerFactory
      |
      | val l = LoggerFactory.getLogger("script")
      |
      | l.error("hello from script")
      |
      |""".stripMargin)
}
而我的
build.sbt
我曾经:

name := "s213"

version := "1.0"

scalaVersion in ThisBuild := "2.13.0"

libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.3.0-alpha4"
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.0-alpha0"
运行
Main
的输出将是:

a is 1, s is String
Logger[main]
[main] INFO  main - hello from injected logger 
[main] ERROR script - hello from script 

古怪的当我自己尝试时,我发现根本没有注册的ScriptEngineFactory实例。@MarkKegel您是否向类路径添加了最新的JAR?噢。这就是问题所在。所以当使用
引擎.eval(读取器,绑定)
时,添加到
绑定中的变量被忽略/不能在scala中使用?这不是一只虫子吗?
name := "s213"

version := "1.0"

scalaVersion in ThisBuild := "2.13.0"

libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.3.0-alpha4"
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.0-alpha0"
a is 1, s is String
Logger[main]
[main] INFO  main - hello from injected logger 
[main] ERROR script - hello from script