2014-11-17 5 views
3

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) 또는 사용 사례 자체가 유효하지 않습니다.

미리 감사드립니다.

+0

봄 4.1.0 이후로 소개 된 버그 인 것 같습니다. JIRA에 대한 PFB 링크 : https : //jira.spring.io/browse/SPR-12444 –

답변

2

이 질문은 답변이없는 목록에 그대로 있습니다. 이것은 실제로 버그이며 사용자는 SPR-12444으로 제기했습니다.

이 문제는 Spring Framework 4.1.3에서 수정 될 예정입니다.

참고로 여러 인스턴스로 응용 프로그램을 배포하는 경우 세션 레지스트리는 기본적으로 인스턴스간에 공유되지 않으므로 앨리스에서 메시지를 보낼 때 문제가 발생합니다 (서버 # 1에 대한 세션과 함께) bob (세션에 대한 서버 # 2).

+0

브라이언에게 추가 정보를 제공해 주셔서 감사합니다. –

+0

안녕하세요, Brian, 저는 답변의 두 번째 글 머리 기호에 관심이 있지만 귀하의 뜻을 이해하지 못합니다. 예를 들어 "simpMessagingTemplate.convertAndSend ("/ user/"+ username +"/queue/chat.message ", message);"와 같은 메시지를 보냅니다. John이/user/alice/queue/messaging을 통해 alice에게 메시지를 보내는 질문에 설명 된 접근 방식과 다른 점은 무엇입니까? – Marios

+0

그래, 죄송합니다.이 대답을 좀 더 정확하게 다시 살펴 보겠습니다. –