使用JMeter測試你的EJB
對EJB進行一些性能基準測試是非常有必要和有幫助的,測試EJB的方法和工具有很多,不過我最近發(fā)現,Apache JMeter是進行基準測試的一個優(yōu)秀工具。可惜的是,JMeter沒有提供一個可測試任意EJB的通用取樣器(sampler),不過,我們可以自己動手來創(chuàng)建一個。
首先,讓我們簡單的了解一下Apache JMeter,它是一個100%的純Java桌面應用,可用于壓力測試和性能測量。它最初被設計用于Web應用測試但后來擴展到其他測試領域。
在本篇文章中,我使用JBoss應用服務器來運行我的EJB。使用其它容器的實現過程應該也非常類似。
1、首先為EJB創(chuàng)建一個工廠(factory)類
我們需要做的第一件事情是,創(chuàng)建一個簡單的Singleton factory class,以為你的測試EJB客戶端實例。參考代碼如下:
- public class MyServiceFactory {
- private static final Log log = LogFactory.getLog(MyServiceFactory.class);
- private static MyService service;
- private static MyServiceFactory me;
- private MyServiceFactory() { }
- static {
- MyServiceFactory.me = new MyServiceFactory();
- }
- public static MyServiceFactory getInstance() {
- return MyServiceFactory.me;
- }
- public MyService getService() {
- if (MyService.service == null) {
- try {
- log.info("Loading the service...");
- Context ctx = new InitialContext();
- service = (MyService)ctx.lookup("MyAction/remote");
- if (service == null) {
- log.error("Didn't get the service!");
- }
- } catch (NamingException e) {
- log.error("Error looking up the remote service", e);
- return null;
- }
- }
- return service;
- }
- }
2、編寫測試代碼
接下來我們需要自己編寫測試EJB代碼,為了實現這個目的,我們可以對JMeter的org.apache.jmeter.protocol.java.sampler包中的AbstractJavaSamplerClient類進行擴展。這個抽象類具有一個runTest方法,我們需要對其進行重寫(override),使用這個方法來實現實際的測試。另外,我們還將重寫getDefaultParameters方法,以使其提供某些合理的默認值,它們將在JMeter圖形應用界面中
- package us.mikedesjardins.demo.jmeter;
- import org.apache.jmeter.config.Arguments;
- import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
- import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
- import org.apache.jmeter.samplers.SampleResult;
- public class DigitalContentServiceEJBTestSampler extends AbstractJavaSamplerClient {
- public SampleResult runTest(JavaSamplerContext context) {
- SampleResult results = new SampleResult();
- MyService service = MyServiceFactory.getInstance().getService();
- results.sampleStart();
- Long param1 = context.getLongParameter("PARAM_1");
- String param2 = context.getStringParameter("PARAM_2");
- MyResult result = service.myMethod(param1, param2);
- if (result != null) {
- results.setSuccessful(true);
- results.setResponseCodeOK();
- results.setResponseMessage("'myResult:" + myResult);
- } else {
- results.setSuccessful(false);
- }
- results.sampleEnd();
- return results;
- }
- @Override
- public Arguments getDefaultParameters() {
- Arguments args = new Arguments();
- args.addArgument("PARAM_1", "4815162342");
- args.addArgument("PARAM_2", "Iculus");
- return args;
- }
- }
3、運行JMeter
JMeter的擴展lib目錄是${JMETER_INSTALL_LIB}/lib/ext。你需要把所有EJB客戶端所需要的jar文件拷貝到這個目錄中。如果你使用的是JBoss,則需要把jbossall-client.jar拷貝到這個目錄中;對于其它應用服務器,則拷貝類似的客戶端jar文件到這個目錄。
當你啟動JMeter后,你的新取樣器(sampler)將會出現在它的Sampler菜單中,這樣你就可以使用它來測試EJB了。
【編輯推薦】