2015-08-08 33 views
0

我想将有关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脚本。

+0

你能在379行显示PerformanceResultCollector的代码吗? –

+0

不确定它是否有帮助,但需要注意的两件事是文件路径分隔符和行结束符。 – cjcroix

+0

@UBIK LOAD PACK PerformanceResultCollector.class只有54行。 379行可能在SaveService.class – user2256235

回答

0

您是否还将MySql驱动程序放入jmeter/lib文件夹中?

你确定你的jdbc网址吗?主机:端口可以从您的Linux机器连接?

CustomCollector构造函数是做什么的?

你试过在非gui模式下的窗口,还是只在gui模式下试过?

+0

感谢您的回复。我只是更新了这个问题。我想我只是知道如何解决它,即使我不知道原因。也许JMeter以非gui和gui模式以不同的方式解析jmx脚本。 – user2256235

+0

嗨,它解析它的方式相同,但init是不同的。你应该接受答案,如果修复是在构造函数中,你似乎指出它。 –

相关问题