2016-11-11 6 views
0

Ich habe einen Testplan mit der Mischung aus normalen HTTP-Sampler und JSR223-Sampler. JSR223 Ich benutze, um Anfragen über Protobuf-Protokoll und HTTP-Sampler für einfache GET/POST-Anfragen auszuführen.Holen HTTPClient von HTTPSampler, um es in Beanshell zu verwenden

Während eines Tests über das SSL-Protokoll haben wir eine große Last auf dem Nginx entdeckt, die eine große Menge an SSL-Handshakes von JSR223-Samplern verursacht. Das Problem war, dass ich ein neues Httpclient in jeder Anforderung erstellt:

CloseableHttpClient client = HttpClients.createDefault(); 

ich es fest mit nur Schaffung einer Instanz dieser Client auf Anfangsstadium und reusage davon in jedem JSR223-Sampler:

CloseableHttpClient client = vars.getObject("client"); 

So, jetzt haben wir die Situation, wenn jeder Thread zwei HTTPClients verwendet (eine verwendet von HTTPSampler, eine von JSR223). Und die Frage ist, gibt es eine Möglichkeit, den HTTPClient aus dem HTTPSampler, um es weiter in JSR223 zu verwenden, um doppelte Handshakes und so weiter zu vermeiden.

Sieht so aus, als ob HTTPSampler savedClient während eines Tests untereinander austauschen.

Antwort

1

Leider gibt es keine "gute" Methode, dies zu tun, so scheint Ihr Weg zu stimmen.

Theoretisch können Sie den Zugriff auf die gleiche HTTPClient-Instanz mit Java Reflection API erhalten, aber denken Sie daran, jedes Mal, wenn Sie mit Reflection irgendwo auf Jometers Limitierung arbeiten, stirbt irgendwie ein Kätzchen.

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.util.EntityUtils; 
import org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl; 

import org.apache.jmeter.samplers.SampleResult; 

import java.lang.reflect.Field; 
import java.lang.reflect.Method; 


Field samplerImpl = sampler.getClass().getDeclaredField("impl"); 
samplerImpl.setAccessible(true); 
HTTPHC4Impl impl = ((HTTPHC4Impl) samplerImpl.get(sampler)); 
Method method = HTTPHC4Impl.class.getDeclaredMethod("setupClient", URL.class, SampleResult.class); 
method.setAccessible(true); 
URL url = new URL("http://example.com"); 
HttpClient client = (HttpClient) method.invoke(impl, url, new SampleResult()); 
HttpGet get = new HttpGet(); 
get.setURI(url.toURI()); 
HttpResponse response = client.execute(get); 
HttpEntity entity = response.getEntity(); 
log.info("******************* Response *************************"); 
log.info(EntityUtils.toString(entity)); 

Demo:

JMeter get HTTPCLient

Und ich würde empfehlen Groovy Sprachumschaltung, wenn Sie hohe Lasten über Scripting führen Besuche Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! für einige Untersuchungen und Benchmarks.

Verwandte Themen