2014-09-05 2 views
4

스프링 메시징을 사용하여 내 webapp의 기록 된 사용자에 대한 실시간 알림 시스템을 만들고 싶습니다. 문서에 따르면,외부 메시지 브로커를 사용하여 브로커 중계

@Override 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/notifications").withSockJS() 
     .setSessionCookieNeeded(true) 
     .setWebSocketEnabled(true); 
} 

@Override 
public void configureMessageBroker(MessageBrokerRegistry registry) { 
    registry.enableSimpleBroker("/topic/", "/queue/"); 
} 

을 그리고 :

나는 다음과 같이 AbstractWebSocketMessageBrokerConfigurer을 정의

응용 프로그램이 특정 사용자를 대상으로 메시지를 보낼 수 있습니다. Spring의 STOMP 지원은 접두어가 "/ user /"인 대상을 인식합니다. 예를 들어 클라이언트는 "/ user/queue/position-updates"대상에 가입 할 수 있습니다. 이 목적지는 UserDestinationMessageHandler에 의해 처리되고 사용자 세션에 고유 한 목적지로 변환됩니다. "/ queue/position-updates-user123". 이는 일반적으로 명명 된 대상에 가입하는 편리함을 제공함과 동시에 동일한 대상에 가입하는 다른 사용자와의 충돌을 방지하여 각 사용자가 고유 한 주식 위치 업데이트를 수신 할 수있게합니다.

"/ user/{username}/queue/position-updates"와 같은 대상으로 메시지를 보낼 수 있으며이 대상은 UserDestinationMessageHandler에 의해 각각 하나씩 하나 이상의 대상으로 변환됩니다 사용자와 관련된 세션. 이를 통해 응용 프로그램 내의 모든 구성 요소는 이름과 일반 목적지 이외의 것을 모르는 채로 특정 사용자를 대상으로 메시지를 보낼 수 있습니다. 이는 메시징 템플릿뿐 아니라 주석을 통해 지원됩니다.

/user/{username}/queue/something에게 메시지를 보내면 {username}으로 식별되는 특정 사용자에게만 배달됩니다.

이제

, 나는 나 사용할 수있는 솔루션을 찾고있어 외부 메시지 브로커 (RabbitMQ, 예를 들어), 봄과 단지 중개 릴레이 등 :

registry.enableStompBrokerRelay("/topic/", "/queue/"); 

후 봄에 외부 메시지 브로커를 구성 :

  • 그것은 메스에 메시지를 보낼 수 sage Broker 채널을 /user/{username/}/queue/something으로 사용 하시겠습니까? 그렇다면 어떻게?
  • /user/{username/}/queue/something 채널을 사용하여 Message Broker에서 메시지를 보내면 Spring은 현재 Principal에 따라 해당 메시지를 {username}으로 보낼 수 있습니까?

답변

1

예는 외부 브로커를 사용하도록 설정하는 경우, 모든 @MessageMapping 반환 값은 JSON으로 직렬화 및 브로커에 전송, 자세한 내용은 참조 문서의 Flow of Messages section에 봐됩니다 수 있습니다. 기본적으로 단순 브로커와 동일합니다.

SimpMessagingTemplate 또는 SimpMessageSendingOperations 콩을 내 OpenSnap example application처럼 삽입 할 수도 있습니다. 컨트롤러에서 사용할 수 있지만 순수 푸시 컨텍스트의 다른 클래스에서도 사용할 수 있습니다.

@MessageMapping 또는 @SubscribeMapping 처리기 메서드에 Principal 매개 변수를 추가하여 주체를 검색 할 수 있습니다 (예 : here). 현재 주체가 자동으로 주입됩니다.