[SPRING] 봄 세션 + 봄 웹 소켓. 세션 ID를 기반으로 특정 클라이언트에게 메시지 보내기
SPRING봄 세션 + 봄 웹 소켓. 세션 ID를 기반으로 특정 클라이언트에게 메시지 보내기
나는 sessionId를 기반으로 특정 클라이언트에게 메시지를 보내기 위해 스택 오버 플로우에서 Quetion1과 Quetion2를 추적했지만 성공을 찾지 못했습니다.
아래 샘플은 RestController 클래스입니다.
@RestController
public class SpringSessionTestApi {
@Autowired
public SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {
String sessionId = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));
}
private MessageHeaders createHeaders(String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
}
Session Id : 클라이언트가 createSession 요청을 보내면 새로운 spring sessionId가 생성되고 MongoDB에도 저장됩니다. 그런 다음 클라이언트가 웹 소켓 연결 요청을 보내면 예상대로 mongoDb에 저장된 동일한 sessionId가 수신됩니다. 모든 것이 잘 작동 할 때까지.
이제는 sessionId를 기반으로 클라이언트에게 응답을 보냅니다. 그 때문에 나는 웹 소켓 클래스 아래있다.
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/messages");
}
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue");
registry.setApplicationDestinationPrefixes("/app");
}
}
연결에 사용하는 샘플 클라이언트 코드는 다음과 같습니다.
function connect() {
stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/user/queue/test', function (greeting) {
console.log("Hello "+greeting);
console.log("Greeting body "+JSON.parse(greeting.body));
});
});
}
제발 도와주세요, 내가 잘못하고있는 곳? 미리 감사드립니다.
해결법
-
==============================
1.사용자 채널을 사용하는 경우 여기에 명시된대로 사용자를 전달하십시오.
사용자 채널을 사용하는 경우 여기에 명시된대로 사용자를 전달하십시오.
@MessageMapping("/messages") public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) throws Exception { messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message); }
-
==============================
2.나는 git에서 Spring Stomp Chat 프로젝트를 발견했다. 링크는 여기에있다. 당신은 그것을 참조 할 수 있습니다. https://gist.github.com/theotherian/9906304
나는 git에서 Spring Stomp Chat 프로젝트를 발견했다. 링크는 여기에있다. 당신은 그것을 참조 할 수 있습니다. https://gist.github.com/theotherian/9906304
from https://stackoverflow.com/questions/43536507/spring-session-spring-web-socket-send-message-to-specific-client-based-on-ses by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @EnableWs가 Spring 빈에서 aop 프록시를 제거한 이유 (0) | 2019.05.15 |
---|---|
[SPRING] 동적 인 Listener 수 추가 (Spring JMS) (0) | 2019.05.15 |
[SPRING] Spring WS 웹 서비스. SAAJ를 사용하여 응답에 첨부 파일 추가 - 엔드 포인트 용 어댑터 없음 (0) | 2019.05.14 |
[SPRING] application.properties에서 값 읽기 Spring Boot (0) | 2019.05.14 |
[SPRING] Spring 부트를 EAR 프로젝트에 통합 (0) | 2019.05.14 |