2014-02-11 70 views
0

我正在嘗試使用JMeter對在雲中運行的應用程序進行基準測試。底層協議使用websockets,但我需要使用一些專有庫來進行這些調用。我看了一些JMeter的websocket插件。但是,不僅僅是測試,我希望使用JMeter能夠爲我的服務器分佈負載生成的能力。我想用我自己的客戶端(用Java編寫)來實現服務器的實際請求。這有些可能嗎?JMeter自定義Java客戶端測試Websocket應用程序

回答

2

有WebSocket的客戶端API的不同實現,即Jetty Websocket APIJava API for WebSocket

最近我一直在研究如何能的WebSockets使用JMeter Load Testing Cloud Solution進行測試。請看下面的概念細節證明。它使用的是JavaSamplerClient API,因此將擴展打包爲.jar並放在JMeter Classpath下將作爲Java請求採樣器提供。

首先您需要Tyrus - 開源JSR-356實現。 Tyrus需要Java 7,因此請確保使用Java SE 7構建和執行擴展。越來越依賴的最方便的方法是使用下面的Apache Maven配置文件

<?xml version="1.0" encoding="UTF-8"?> 

<project xmlns="http://maven.apache.org/POM/4.0.0" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

<modelVersion>4.0.0</modelVersion> 

<groupId>blazemeter-websocket</groupId> 

<artifactId>blazemeter-websocket</artifactId> 

<version>1.0-SNAPSHOT</version> 

<dependencies> 

<dependency> 

<groupId>javax.websocket</groupId> 

<artifactId>javax.websocket-client-api</artifactId> 

<version>1.0</version> 

</dependency> 

<dependency> 

<groupId>org.glassfish.tyrus</groupId> 

<artifactId>tyrus-client</artifactId> 

<version>1.1</version> 

</dependency> 

<dependency> 

<groupId>org.glassfish.tyrus</groupId> 

<artifactId>tyrus-container-grizzly</artifactId> 

<version>1.1</version> 

</dependency> 

<dependency> 

<groupId>javax.json</groupId> 

<artifactId>javax.json-api</artifactId> 

<version>1.0</version> 

</dependency> 

<dependency> 

<groupId>org.glassfish</groupId> 

<artifactId>javax.json</artifactId> 

<version>1.0.1</version> 

</dependency> 

</dependencies> 

</project> 

Invokation目標的「MVN依賴性:複製依賴」會下載所有需要的jar到/ target /依賴性文件夾中。不過你可以繼續構建,打包等maven插件。

來源擴展的代碼如下:

package com.blazemeter; 

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; 

import org.apache.jorphan.logging.LoggingManager; 

import org.apache.log.Logger; 

import org.glassfish.tyrus.client.ClientManager; 

import javax.websocket.*; 

import java.io.IOException; 

import java.net.URI; 

import java.util.concurrent.CountDownLatch; 

import java.util.concurrent.TimeUnit; 

@ClientEndpoint 

public class BlazemeterWebsocketRequest extends AbstractJavaSamplerClient { 

private static String ws_uri; 

private static String ws_message; 

private static String response_message; 

private static CountDownLatch latch; 

private static final Logger log = LoggingManager.getLoggerForClass(); 

@Override 

public Arguments getDefaultParameters() { 

Arguments params = new Arguments(); 

params.addArgument("URI", "ws://echo.websocket.org"); 

params.addArgument("Message", "Blazemeter rocks!"); 

return params; 

} 

@Override 

public void setupTest(JavaSamplerContext context) { 

ws_uri = context.getParameter("URI"); 

ws_message = context.getParameter("Message"); 

} 

@Override 

public SampleResult runTest(JavaSamplerContext javaSamplerContext) { 

SampleResult rv = new SampleResult(); 

rv.sampleStart(); 

latch = new CountDownLatch(1); 

ClientManager client = ClientManager.createClient(); 

try { 

client.connectToServer(BlazemeterWebsocketRequest.class, new URI(ws_uri)); 

latch.await(1L, TimeUnit.SECONDS); 

} catch (Throwable e) { 

throw new RuntimeException(e); 

} 

rv.setSuccessful(true); 

rv.setResponseMessage(response_message); 

rv.setResponseCode("200"); 

if (response_message != null) { 

rv.setResponseData(response_message.getBytes()); 

} 

rv.sampleEnd(); 

return rv; 

} 

@OnOpen 

public void onOpen(Session session) { 

log.info("Connected ... " + session.getId()); 

try { 

session.getBasicRemote().sendText(ws_message); 

} catch (IOException e) { 

throw new RuntimeException(e); 

} 

} 

@OnMessage 

public String onMessage(String message, Session session) { 

log.info("Received ... " + message + " on session " + session.getId()); 

response_message = message; 

try { 

session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE,"")); 

} catch (IOException e) { 

e.printStackTrace(); 

} 

return response_message; 

} 

@OnClose 

public void onClose(Session session, CloseReason closeReason) { 

log.info(String.format("Session %s close because of %s", session.getId(), closeReason)); 

} 

} 

希望這有助於

D.

+0

感謝,尋找到Java的取樣! –

相關問題