【问题标题】:jmeter error on load SaveService.loadProperties();加载 SaveService.loadProperties() 时出现 jmeter 错误;
【发布时间】:2017-10-07 09:35:46
【问题描述】:

我想做什么:

我构建了一个 java 服务来加载一个测试计划并运行它。我没有使用任何 Bash 脚本和 jmeter GUI。 java App 是作为服务构建的,因此可以在云中运行。想法是,只是为了创建一些直径流量数据。

当我在 intellij(本地)上运行 src 时,一切正常。

启动应用,一切OK。

java -jar -Dserver.port=8090 diameter-service-0.0.1-SNAPSHOT.jar

运行 REST 请求:

localhost:8090/api/v1/encode

请求后我收到以下错误:

java.io.FileNotFoundException: file:/Users/myuser/Downloads/diameter-service-0.0.1-SNAPSHOT.jar!/jmeter/bin/saveservice.properties (No such file or directory)

我首先检查的是 jMeter Home。 控制台上的系统输出:

HOME: file:/Users/myuser/Downloads/diameter-service-0.0.1-SNAPSHOT.jar!/jmeter

这些文件也可用,并且位于 bin 下,并且位于类路径中的 slo 下。

/src/main/resources/jmeter/bin/saveservice.properties
/src/main/resources/jmeter/bin/jmeter.properties
/src/main/resources/jmeter/bin/user.properties

我认为 jMeter Home 路径是可以的。 ..或者这是一个错误的假设? 方式jMeter无法加载saveservice.properties?

是因为 jmeter 尝试使用 FILE 类打开文件吗? java如何加载saveservice.properties?还是因为设置了 jMeter Home 而不是必需的?

private static final String jMeterHomePath = "/jmeter";
private static final String jMeterPropertiesFile = jMeterHomePath + "/bin/jmeter.properties";
...


File propertiesFile = FileStreamUtil.jMeterPropertiesToTempFile(jMeterPropertiesFile);
String jMeterPropertiesPath = propertiesFile.getPath();

StandardJMeterEngine jMeter = new StandardJMeterEngine();    JMeterUtils.setJMeterHome(Encoder.class.getResource(jMeterHomePath).getPath());

JMeterUtils.loadJMeterProperties(jMeterPropertiesPath);

JMeterUtils.initLogging();
JMeterUtils.initLocale();

String home = JMeterUtils.getJMeterHome();
System.out.println("HOME: "+home);

SaveService.loadProperties();

【问题讨论】:

  • 打开你的 jar 并检查你有这个资源:jmeter/bin/saveservice.properties 在类路径目录或 jar 的根目录中
  • 其实我已经把它跑到云端了。 Last comment

标签: java jmeter


【解决方案1】:

根据SaveService class sourcesaveservice.properties文件正在读取如下:

// some code

private static final String SAVESERVICE_PROPERTIES_FILE = "/bin/saveservice.properties"; 

// Property name used to define file name
private static final String SAVESERVICE_PROPERTIES = "saveservice_properties"; // $NON-NLS-1$

// some more code


public static Properties loadProperties() throws IOException{
    Properties nameMap = new Properties();
    try (FileInputStream fis = new FileInputStream(JMeterUtils.getJMeterHome()
            + JMeterUtils.getPropDefault(SAVESERVICE_PROPERTIES, SAVESERVICE_PROPERTIES_FILE))){
        nameMap.load(fis);
    }
    return nameMap;
}

所以您需要确保您的 JMeter Home 下有 bin/saveservice.properties 文件,这样它才能按预期工作。

如果您将 JMeter 打包到您的解决方案中,您需要unpack it somewhere 才能使其工作。否则,您将需要修补上述 SaveService 类,以便它从资源文件中读取属性。

请参阅Five Ways To Launch a JMeter Test without Using the JMeter GUI 文章以获取有关以编程方式执行 JMeter 测试的更多信息以及一些示例。

【讨论】:

  • 好的,在云中解压某些地方是不可能的,我们现在没有文件服务。另一点是我在网络上的每个地方都找到了带有该调用的java代码:JMeterUtils.loadJMeterProperties(jMeterPropertiesPath);这没有任何意义,因为我不使用返回值。
  • 嗯,您实际上可以指定自定义 saveservice.properties 文件位置,例如 System.setProperty("saveservice_properties","/path/to/saveservice/properties");,但这不会是故事的结尾,因为 JMeter 需要更多属性文件,即 @ 987654328@ 并且您将无法以 JMeter 向其添加额外斜线的方式使用它,即使您覆盖该属性
【解决方案2】:

当文件位于 Jar 中时,您无法使用 File 类打开该文件。 它无法处理文件 url 中的感叹号 (!)。

如果这是您的问题,请在此处查看解决方案: Accessing a file inside a .jar file

【讨论】:

  • 不,这不是问题,我知道如何从 classPath 获取文件。关键是 JMeter 是为在文件系统环境中使用而构建的。我现在得到了在云中运行我的服务的解决方案。我将所有道具文件从容器移动到临时文件夹,并将 JMeter home 指向此路径。
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 2016-09-11
  • 1970-01-01
  • 2018-11-07
  • 2017-09-19
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多