我想将有关sampleResult的信息保存到MySQL中。所以我写我自己的名为性能记录器的侦听器。它可以在我的Windows上正常工作。但是当我将相同的JMeter Script移到Linux中时,它失败了。以下是关于我的自定义侦听器的一些代码。我的自定义JMeter侦听器无法在Linux中工作
LoggerVisualizer.class
public class LoggerVisualizer extends AbstractVisualizer {
private PerformanceResultCollector collector;
public LoggerVisualizer() {
super();
initConfiguration();
}
private void initConfiguration() {
// some code
}
@Override
public void clearData() {
//some codes
}
public String getStaticLabel() {
return "Performance Logger";
}
public String getLabelResource(){
return "Performance Logger";
}
@Override
public void add(SampleResult sampleResult) {
}
public TestElement createTestElement() {
if (collector == null) {
collector = new PerformanceResultCollector();
}
modifyTestElement(collector);
return collector;
}
}
PerformanceResultCollector.class
public class PerformanceResultCollector extends ResultCollector implements Serializable {
CustomCollector collector;
public PerformanceResultCollector() {
log.info("construct performance collector")
collector = new CustomCollector();
}
@Override
public void sampleOccurred(SampleEvent e) {
collector.addSample(e.getResult());
}
public void cleanUp(){
CustomCollector.cleanUp();
}
}
在我的Windows服务器,我添加了监听器,它工作得很好。我可以看到MySQL服务器中的数据。但是,当我移动脚本到Linux,并用命令
nohup ./jmeter -n -t /opt/tests/test.jmx -l /opt/log/perf_result.csv -Jjmeter.save.saveservice.output_format=csv -Jjmeter.save.saveservice.hostname=true -Jjmeter.save.saveservice.print_field_names=false -Jjmeter.save.saveservice.url=true -Jjmeter.save.saveservice.thread_counts=true -Jjmeter.save.saveservice.timestamp_format="yyyy-MM-dd HH:mm:ss" > /opt/log/jmeter_script_run.out 2> /opt/log/jmeter_script_run.err < /dev/null
运行它,我得到的错误jmeter.log这样的:
2015/08/08 04:36:28 INFO - com.test.jmeter.logger.PerformanceResultCollector: construct performance collector
2015/08/08 04:36:28 ERROR - jmeter.save.SaveService: Conversion error com.thoughtworks.xstream.converters.ConversionException: java.lang.NullPointerException : java.lang.NullPointerException
---- Debugging information ----
message : java.lang.NullPointerException
cause-exception : java.lang.RuntimeException
cause-message : java.lang.NullPointerException
class : com.test.jmeter.logger.PerformanceResultCollector
required-type : com.test.jmeter.logger.PerformanceResultCollector
converter-type : org.apache.jmeter.save.converters.TestElementConverter
path : /jmeterTestPlan/hashTree/hashTree/hashTree/com.test.jmeter.logger.PerformanceResultCollector
line number : 379
class[1] : org.apache.jorphan.collections.ListedHashTree
converter-type[1] : org.apache.jmeter.save.converters.HashTreeConverter
------------------------------- : java.lang.NullPointerException : java.lang.NullPointerException
---- Debugging information ----
message : java.lang.NullPointerException
cause-exception : java.lang.RuntimeException
cause-message : java.lang.NullPointerException
class : com.test.jmeter.logger.PerformanceResultCollector
required-type : com.test.jmeter.logger.PerformanceResultCollector
converter-type : org.apache.jmeter.save.converters.TestElementConverter
path : /jmeterTestPlan/hashTree/hashTree/hashTree/com.test.jmeter.logger.PerformanceResultCollector
line number : 379
class[1] : org.apache.jorphan.collections.ListedHashTree
converter-type[1] : org.apache.jmeter.save.converters.HashTreeConverter
在日志中,我发现它已经alreay来到PerformanceResultCollector的构造函数中。但为什么它抛出NulPointerException。我确认Linux上的jmeter的lib和Windows上的一样。任何人都可以告诉我听众有什么问题吗?非常感谢
后,我已经修改了我的代码很多次,我终于知道如何解决它,甚至通过我不知道原因。在PerformanceResultCollector.class中,如果我构造了惰性CustomCollector,它将起作用。
public class PerformanceResultCollector extends ResultCollector implements Serializable {
CustomCollector collector;
public PerformanceResultCollector() {
log.info("construct performance collector")
}
@Override
public void sampleOccurred(SampleEvent e) {
if (null == collector) {
collector = new CustomCollector();
}
collector.addSample(e.getResult());
}
public void cleanUp(){
CustomCollector.cleanUp();
}
}
也许JMeter以非gui和gui模式以不同的方式解析jmx脚本。
你能在379行显示PerformanceResultCollector的代码吗? –
不确定它是否有帮助,但需要注意的两件事是文件路径分隔符和行结束符。 – cjcroix
@UBIK LOAD PACK PerformanceResultCollector.class只有54行。 379行可能在SaveService.class – user2256235