2017-11-08 18 views
0

AbstractJavaSamplerClient를 확장하여 사용자 정의 샘플러를 성공적으로 만들었습니다. 샘플러 구현에서 JMS 연결을 만들고 메시지를 대기열로 보냈습니다. 이것은 훌륭하게 작동합니다. Ramp-up 1로 쓰레드 그룹을 100으로 설정하면 샘플러가 100 개의 메시지를 푸시합니다.JMeter 사용자 정의 샘플러 - 여러 개의 runTest와 동일한 연결을 공유합니다.

이제 JMeter 시작시 한 번 연결을 만든 다음 동일한 연결을 다시 실행하여 각 실행시 메시지를 보내도록했습니다.

누구든지 JMeter 시작시 연결을 작성한 다음 샘플러와 동일한 연결을 공유하는 방법을 설명 할 수 있습니까?

참고 : JMS에 메시지를 게시하는 데 걸리는 시간을 계산하는 것뿐만 아니라 다른 응용 프로그램 이벤트를 기반으로 응답 시간을 계산하기 때문에 기존 JMS 게시자를 사용할 수 없습니다.

미리 감사드립니다.

+0

@ user7294900 링크를 공유해 주셔서 감사합니다. 필자는이 링크를 이미 방문했지만 나의 요구 사항에 맞지 않습니다. 왜냐하면 제 경우에는 연결 공유를 구현하는 방법을 이해할 필요가있는 사용자 정의 샘플러가 있기 때문입니다. – VinothNair

답변

1

testStarted method을 사용하여 모든 스레드에 대한 연결을 초기화 할 수 있습니다. 이 메소드는 스레드가 복제되기 전에 한 번 실행되므로, testStarted에 연결 풀이 있어야합니다. 그러면 연결 풀을 가져 와서 사용할 수 있습니다. 예를 들어 매우 원시적 인 연결 풀은 키와 연결 객체에 대한 순차적 ID가있는 맵입니다.

그래서 같은 간단한 풀이로 초기화 할 수 :

@Override 
public void testStarted() 
{ 
    int maxConnections = getThreadContext().getThreadGroup().getNumThreads(); 

    ConcurrentMap<Integer, Object> connections = new ConcurrentHashMap<Integer, Object>(); 

    for(int i = 0; i < maxConnections; i++) 
    { 
     Object connection = //... whatever you need to do to connect 
     connections.put(new Integer(i), connection); 
    } 

    // Put in the context of thread group 
    JMeterContextService.getContext().getVariables().putObject("MyConnections", connections); 
} 

(연결 개체가 필요에 따라보다 구체적인 유형, 수) 각 스레드는 스레드 수에 따라, 그 풀에서 하나의 연결을 것입니다 .

나중에는 sample 방법을 사용할 수 있습니다

// Get connections pool from context 
ConcurrentMap<Integer, Object> connections = (ConcurrentHashMap<Integer, Object>) JMeterContextService.getContext().getVariables().getObject("MyConnections"); 
// Find connection by thread ID, so each thread goes to a different connection 
connections.get(getThreadContext().getThreadNum()); 

을 스레드 수는 실행 시간과 내가 연결 초기화에 사용되는 초기 순차적 인 정수로 반환 사이에 여기에 내가 순진 완벽한 매핑을 가정합니다. 최선의 가정은 아니지만 개선 될 수는 있지만 유효한 출발점입니다.

그런 다음 testEnded method에서 연결을 닫고 제거 할 수 있습니다. 이 방법은 한 번 실행, 그래서 우리는 모든 연결을 닫습니다

@Override 
public void testEnded() 
{ 
    for(Entry<Integer, Object> connection : connections.entrySet()) 
    { 
     connection.close(); // or do whatever you need to close it 
     connections.remove(connection.getKey()); 
    } 
} 

또는 모든 연결이 종료 될 때 그냥 connections.clear()를 호출 할 수 있습니다.

공개 :이 답변에서 코드를 직접 테스트하지는 않았지만 과거에는 비슷한 코드 조각을 사용하여이 질문에 대답했습니다. 문제가 있으면이 답변을 업데이트하십시오.

+0

세부 정보를 보내 주셔서 감사합니다. 나는 당신의 제안을 시도하고 결과로 당신에게 돌아올 것입니다. – VinothNair

+0

귀하의 답변에서 코드를 구현하려했지만 testStarted 및 testEnded 메소드가 AbstractJavaSamplerClient에서 재정의하도록 선언되지 않았습니다. 내 샘플러에서는 현재 AbstractJavaSamplerClient를 확장하고 runTest 메서드를 재정의하고 있습니다. testStarted 및 testEnded 메소드를 재정의하기 위해 샘플러를 다른 클래스에서 확장해야하는지 명확히하십시오. 감사합니다 – VinothNair

+0

알았어. 이제 AbstractSampler를 확장하고 TestBean을 구현하고 재정 의하여 testStarted 및 testEnded를 재정의했습니다. 잘됐다. – VinothNair