Jmeter에서 SSE 에러 실패로 표시하기
💬 Jmeter에서 서버에서 보내는 에러가 받아지는 것을 확인했습니다. 이제는 그 에러를 가지고 메시지를 출력해주려고 합니다. 결과를 실패로 변경해야 합니다.
✔ 첫 번째 시도
💬 JSR223 Sampler에 작성한 스크립트에서 발생하는 에러를 JSR233 Assertion에서 받아서 실패로 처리해주려고 했습니다. 두 작업 간에 데이터를 공유시켜 줄 수 있는 내장 변수 객체 vars를 사용하기로 했습니다.
💢 공유할 데이터가 vars에 업데이트가 되지 않았습니다. 원인은 EventHandler 클래스 같은 외부 라이브러리에서 Jmeter 내장 객체 vars를 사용할 수 없기 때문이었습니다.
✔ 두 번째 시도
💬 vars를 사용할 수 없다면 그것을 대체할 수 있는 클래스를 하나 만들어 사용하기로 했습니다. 클래스를 하나 만들어 Jmeter에서 사용할 수 있도록 *. jar를 파일을 Jmeter/lib/ext 파일 안에 넣어줬습니다.
💢 매 스레드마다 객체가 추가적으로 생성이 되다 보니, 기존에 성공했던 요청도 Jmeter에서 사용할 수 있는 메모리의 한계치를 넘어가 실패가 발생했습니다.
✔ 세 번째 시도
💬 기능이 별도로 분리가 되는 것이 좋다고 생각해서 Sampler와 Assertion로 나누었습니다. 그런데 이것을 위해서는 두 작업 간에 데이터 공유가 가능해야 하는데 한계가 있다는 것이 알게 되었습니다. 그래서 간단하게 Assertion을 없애고 Sampler에 하나에서 처리하기로 했습니다.
✅ EeventHandler 클래스에 errorMessage 멤버 변수를 선언을 했습니다. onError가 뜰 경우 errorMessage에 메시지를 넣게 했습니다. 그리고 작업이 모두 끝날 때 errorMessage가 null이 아닌 경우 실패로 뜨게 했습니다. 이것을 통해 에러를 표시할 수 있게 되었습니다.
import com.launchdarkly.eventsource.EventSource import com.launchdarkly.eventsource.EventHandler import com.launchdarkly.eventsource.MessageEvent import java.net.URI import java.io.StringReader import java.util.concurrent.TimeUnit import java.time.Duration import java.time.LocalTime import java.util.concurrent.ConcurrentHashMap class SimpleEventHandler implements EventHandler { List<String> respList = [] String errorMessage = null int count = 0 void onOpen() {} void onClosed() {} void onMessage(String Event, MessageEvent messageEvent) throws java.lang.Exception { if (Event.equals("BID_PRICE_UPDATE")) { count = count + 1 respList.add(messageEvent.getData()) } else { respList.add("init message : " + messageEvent.getData() + "\n") } } void onComment(String comment) { System.out.println("comment : " + comment) } void onError(Throwable t) { int threadNum = Thread.currentThread().getId(); errorMessage = t.getMessage(); } } EventHandler eH = new SimpleEventHandler() String responseList = "" String[] parameters = Parameters.split(",") String uri = parameters[0] long reconnectionTimeMs = parameters[1].toLong() long sleepDuration = parameters[2].toLong() EventSource.Builder builder = new EventSource.Builder(eH, URI.create(uri)) EventSource eventSource = builder.readTimeout(sleepDuration + 10, TimeUnit.SECONDS).build() eventSource.setReconnectTimeMillis(reconnectionTimeMs) try { eventSource.start() TimeUnit.SECONDS.sleep(sleepDuration) } catch(Exception e) { eventSource.close() } finally { eventSource.close() } responseList = responseList + "amount : " + eH.count + "\n" responseList = responseList + "erro message : " + eH.errorMessage + "\n" for (String respRecord : eH.respList) { responseList = responseList + "Updated Bid Price: ${respRecord}\n" } SampleResult.setResponseData(responseList, "866") if(eH.errorMessage != null) { SampleResult.setSuccessful(false); }
✔ 결과
'개발일지 > TIL' 카테고리의 다른 글
[230824] 성능 향상을 위한 EC2 Instance Scale-Up (0) | 2023.08.24 |
---|---|
[230823] 입찰 테스트 시 HikariCP Timeout 문제 (0) | 2023.08.23 |
[230821] 서버에서 클라이언트로 SSE 예외 전달하기 (0) | 2023.08.21 |
[230819] Jmeter SSE 테스트 데이터 전송 받지 못하는 문제 (0) | 2023.08.19 |
[230818] Jmeter SSE 테스트 (0) | 2023.08.18 |