Jmeter STOMP test (WebSocket Samplers)

jmeter plugins manager를 설치하고 WebSocket Samplers by Peter Doornbosch를 설치한다.

 

BeanShell Sampler에 자바 문법을 작성할 수 있다.

JAVA에서 특수문자(큰따옴표)를 String에 넣으려면 앞에 역슬러쉬를 붙여야 한다. 그래서 STOMP_SEND의 경우 { "type" : "talk" }은 { \\"type\\":\\"talk\\" } 다음과 같이 작성한다.

( 역슬러쉬 1개인데 1개로 작성하면 구글 Search Console에 파싱할 수 없는 구조화된 데이터 문제가 감지된다고 나와서 2개로 표현함 )

 

STOMP 프레임은 이전 글을 참고 Stomp protocol

 

Stomp protocol

Stomp Design Simple Text Oriented Messaging Protocol STOMP 디자인을 이끄는 주요 철학은 단순성과 상호 운용성으로 다양한 언어로 클라이언트와 서버 측 모두에서 쉽게 구현할 수 있는 경량 프로토콜로 설계

cornpip.tistory.com

 

BeanShell에서 vars.put("a", "~~") 한 변수는 Sampler에서 ${a} 사용할 수 있다.

 

WebSocket Sampler에 WebSocket Open Connection이 있는데 STOMP 연결 프레임을 별도로 안보내면 STOMP 응답 프레임을 받을 수 없었다.

(WebSocket Single Read Sampler가 timeout 된다.)

 

Client Frame Command(CONNECT, SUBSCRIBE, SEND, DISCONNECT 등)는 BeanShell에 문법을 작성하고 Single Write Sampler로 전송하면 된다.

CONNECT 프레임을 보낸 후에는 existing connection을 선택한다.

 

loop는 Logic Controller -> Loop Controller에 있고 반복 횟수를 정할 수 있다.

Counter는 Config Element -> Counter에 있고 반복 sampler 이름에 변수를 잡을 수 있다.

 

(구독한 채널에 SEND를 한다.)

위와 같이 구성하고 반복 횟수를 20으로 지정했을 때, 샘플러는 순차대로 진행되기 때문에  SEND*20 다음에 READ*20 이 진행되는데 2가지를 생각했다.

- SEND 직후 READ 하지 않으면 응답 프레임이 휘발될까

- 휘발되지 않는다면 READ는 순차적일까

우선 첫 번째로 바로 READ하지 않아도 휘발되지 않았고 두 번째로 READ는 순차적이지 않았다. 예시로

read_4의 response data = {id: 57503, ~~}

read_5의 response data = {id: 57502, ~~}

read_7의 response data = {id: 57501, ~~}

 

그래서 추측하면, Spring Stomp 서버는 client가 disconnect 되지 않았다면 일정 개수의 응답 프레임을 버퍼에 쌓아두는 게 있는 듯하고 버퍼에 쌓인 응답은 순서에 무관한 알고리즘으로 건네준다.

 

stomp 서버는 disconnect를 받고 바로 연결을 끊지 않고 마지막 응답 프레임을 보내준다.

 

DISCONNECT 프레임에 receipt 헤더를 지정했다면 RECEIPT 프레임을 받고

receipt 헤더를 지정하지 않았다면 ERROR 프레임을 받는다.

'Language > Java' 카테고리의 다른 글

java thread (자바의 정석)  (1) 2023.12.10
java factory method pattern  (0) 2023.09.06
java object equals  (0) 2023.08.08
자바) ArrayList LinkedList 시간 비교 (23-07-06)  (0) 2023.07.13
자바) ArrayList Capacity (23-07-06)  (0) 2023.07.13