복붙노트

[SPRING] 스프링 웹 소켓 : 오프라인 사용자에게 메시지 보내기 - 메시지 브로커에 대기열에 포함되지 않은 메시지

SPRING

스프링 웹 소켓 : 오프라인 사용자에게 메시지 보내기 - 메시지 브로커에 대기열에 포함되지 않은 메시지

나는 메시지 브로커 (activemq)를 사용하여 스프링과 웹 소켓이있는 webapp를 가지고있다.

여기 내 설정 클래스입니다 :

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableStompBrokerRelay("/topic","/queue/");
    config.setApplicationDestinationPrefixes("/app");
 }

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/hello").withSockJS();
 }

}

사용자 이름 "StanTheMan"에 지속적으로 메시지를 전송하는 예약 된 작업이 있습니다.

@Scheduled(fixedDelay = 1000)
public void sendGreetings() {
   HelloMessage hello = new HelloMessage();
   hello.setContent("timeStamp:" + System.currentTimeMillis());
   String queueMapping = "/queue/greetings";    
   template.convertAndSendToUser(
                     "DannyD",
                     queueMapping,
                     hello);

}

현재 사용자가 websocket을 통해 서버에 연결되어 있지 않은 경우 - 모든 메시지가 대기열에 들어 가지 않고 단순히 삭제됩니다. 그가 연결할 때마다 신선한 메시지가 대기열에 들어가게됩니다. 어떤 방식 으로든 "convertAndSendToUser"메시지를 오프라인 사용자에게 보낼 수 있습니까? 나는 나중에 다시 연결하고 만료 된 시간이 끝나지 않았을 때 나중에 밀어 넣을 오프라인 사용자를 위해 만료 된 메시지를 대기열에 넣고 싶습니다.

내가 어떻게 그걸 얻을 수 있니? 분명히 실제 메시지 브로커 (activemq)를 사용하여이를 달성하는 데 도움이되었지만 방법은 무엇입니까?

감사!

해결법

  1. ==============================

    1.실제로이 기능은 (현재) 연결된 사용자에게만 메시지를 보내는 데 사용할 수 있습니다.

    실제로이 기능은 (현재) 연결된 사용자에게만 메시지를 보내는 데 사용할 수 있습니다.

    우리는 실패한 메시지를 추적하는 더 나은 방법을 제공 할 계획입니다 (SPR-10891 참조). 그 동안 임시 해결책으로 UserSessionRegistry를 @Scheduled 구성 요소에 삽입하고 getSessionIds 메소드가 비어 있지 않은 Set를 반환하는지 확인할 수 있습니다. 그것은 사용자가 연결되었음을 나타냅니다.

    한 가지 대안은 영구 메시지를 수신하기 위해 각 사용자가 가입 할 수있는 대기열 이름 (자신의 사용자 이름이나 다른 고유 한 이름을 기반으로 할 수 있음)에 대한 자체 규칙을 사용하는 것입니다. ActiveMQ STOMP 페이지에는 지속성 메시지 및 만료 시간에 대한 섹션이 있습니다.

  2. ==============================

    2.이는 메시지 브로커의 기본 동작입니다. 또한 ActiveMQ 브로커를 기본 브로커로 설정하지 않아 Spring에서 메모리 내장 브로커를 설정합니다.

    이는 메시지 브로커의 기본 동작입니다. 또한 ActiveMQ 브로커를 기본 브로커로 설정하지 않아 Spring에서 메모리 내장 브로커를 설정합니다.

    당신이 원하는 것을 얻으려면 / webmocket 메시지 브로커에게 activeMQ에 대한 자세한 정보를 제공하십시오. Spring은 이러한 설정을 제공하지 않으므로 ActiveMQ 측에서 모든 지속성 설정을 수행해야한다. .

    spring websocket 메시지 브로커에 ActiveMQ를 설정하려면 stomp를 활성화하고 다음을 사용해야합니다.

    registry.enableStompBrokerRelay("/topic").setRelayHost("hostName").setRelayPort("00000");
    

    더 자세한 정보를 원하시면 : http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/messaging/simp/config/StompBrokerRelayRegistration.html

  3. from https://stackoverflow.com/questions/23782390/spring-websockets-sending-a-message-to-an-offline-user-messages-not-enqueued by cc-by-sa and MIT license