spring websocket 및 stomp를 사용하여 채팅 응용 프로그램을 만들려고합니다.
봄 4.1.1, Stomp.js, ActiveMQ 5.9를 사용하고 있습니다.
이 사용자는 로그인 한 친구 각각에게 앱에 로그인하여 메시지를 보낼 수 있습니다. 특정 사용자에게 메시지를 보내려면 다음 단계를 수행하십시오.
1) 사용자 로그인
2) 사용자가 "/ user/queue/messaging"대상에 가입합니다.
사용자의 비공개 메시지를 서로 보내는 데 사용됩니다.
3) 사용자가 메시지를 보내려고 할 때 사용자에게 목적지로 보냅니다.
/user/{user_id}/queue/messaging 여기서 user_id는 수신자 사용자 ID입니다.
STOMP.js send 메서드를 사용하여 클라이언트에서 보내려고합니다.
4) 예상되는 동작 : 이제받는 사람이 로그인되어 있고 세션 ID (예 : DFT0GH)가 있으면 e 단계의 메시지를 이름 messaging-userDFT0GH 인 큐 대상에 배달해야합니다. 이 대신에 그것을 보낸 동일한 사용자의 대기열 대상으로 배달됩니다.Spring Websocket STOMP를 사용하여 특정 메시지를 보낼 수 없습니다.
예제보기 :
1) 사용자 John이 로그인합니다. 그는 구독/사용자/큐/메시징
자신의 사용자 ID가 존
그의 세션 ID가 ABCD01
대기열이 messaging- userABCD01
2)의 사용자 앨리스 로그로의 ActiveMQ 브로커의 이름으로 만든입니다.
그녀는에이/사용자/큐/메시징 구독
자신의 사용자 ID는 앨리스
입니다 그녀의 세션 ID는 messaging-가 이
3) 사용자 John이 메시지를 보냅니다
userXYZ01로의 ActiveMQ 브로커에 이름을 XYZ01대기열 생성됩니다 STOMP.js는 큐에 메시지를 지금
4 "메시징/사용자/앨리스/큐 /")로 대상을 사용하는 대신 전달 앨리스 에 방법을 보낼 통해 는 메시징 즉 요한의 대기열 대상으로 전달됩니다 messaging- UserXYZ01 - userAB CD01. 왜 그래야만하지? 널 (null) 사용자의 (교장) 세션 ID에 기록이 sessionId가에서
if (SimpMessageType.MESSAGE.equals(messageType)) {
........
sessionIds = (sessionId != null ?
Collections.singleton(sessionId) : this.userSessionRegistry.getSessionIds(user));
}
하지 않은 :이 디버깅 할 때
, 나는 DestinationInfo parseUserDestination DefaultUserDestinationResolver 클래스의 (메시지 메시지) 개인 방법에 다음 줄을 발견 사용자가 로그인되어 있으므로 해당받는 사람이 다른 경우에도 그의 sessionIds가 반환되고 메시지가 대기열로 배달됩니다.
usersessionregistry의 sessionIds 컬렉션을 확인할 때 [alice] : XYZ01 항목을 찾습니다.
사용자가 세션에 로그인하여 대상 큐를 식별하는 대신 사용자가 세션 ID를 반환하면 안됩니다.
죄송합니다. 처음 시도합니다. 그래서 여기에 무엇이든 놓친다면 알려주세요.
1) 내 사용 사례를 만족시킬 수있는 방법
2) 또는 사용 사례 자체가 유효하지 않습니다.
미리 감사드립니다.
봄 4.1.0 이후로 소개 된 버그 인 것 같습니다. JIRA에 대한 PFB 링크 : https : //jira.spring.io/browse/SPR-12444 –