2016-09-02 2 views
1

그래서 RabbitMQ 브로커로 Spring Message Relay (Spring Messaging stuff) 기능에 대해 읽었습니다. 내가 원하는 것은 다음과 같습니다 :RabbitTemplate을 사용하여 SimpMessagingTemplate.convertAndSendToUser을 모방하는 방법은 무엇입니까?

rabbitmq와 브라우저 사이의 메시지 중계 역할을하는 서비스 (1)가 있습니다. 이 지금은 잘 작동합니다. MessageBrokerRegistry.enableStompBrokerRelay를 사용하고 있습니다.

백엔드에서 다른 대기열에 메시지를 보내고 RabbitMQ에 메시지를 보내고 해당 메시지를 특정 사용자에게 라우팅합니다 (2). 보낸 사람으로서 메시지 전달 대상을 제어 할 수 있기를 원합니다.

일반적으로 SimpMessagingTemplate을 사용하면됩니다. 문제는 메시지의 출처가 릴레이로 작동하지 않고 웹 소켓을 사용하지 않고 대기열 이름을 세션 ID에 매핑하지 않기 때문에 실제로 메시지의 출처가 해당 템플릿에 액세스하지 못한다는 것입니다.

내가 생각할 수있는 한 가지 방법은 모든 대기열에서 수신 대기하고 간단한 템플릿을 사용하여 전달하는 서비스 1에 간단한 클래스를 작성하는 것입니다. 그러나 나는 이것이 이상적인 방법은 아니며, 이미 봄을 사용하여 그것을 할 수있는 방법이있는 것처럼 느낍니다.

상담 해주실 수 있습니까?

답변

1

This question 나는 직면 한 동일한 딜레마에 대해 생각하게했다. 나는 사용자 정의 UserDestinationResolver을 가지고 놀기 시작했는데, 이것은 기본 리졸버가 사용하는 세션 ID가 아닌 사용자 이름 만 사용하는 일관된 주제 명명 스키마에 도달했습니다.

JS를 "/user/exchange/amq.direct/current-time"에 가입 시키지만 바닐라 RabbitMQ 응용 프로그램을 통해 "/exchange/amqp.direct/users.me.current-time"("me"라는 사용자에게).

최신 소스 코드는 here이고 내가 가지고있는 기존 @Configuration 클래스에 as a @Bean을 "등록"합니다.

public class ConsistentUserDestinationResolver implements UserDestinationResolver { 
    private static final Pattern USER_DEST_PREFIXING_PATTERN = 
      Pattern.compile("/user/(?<name>.+?)/(?<routing>.+)/(?<dest>.+?)"); 

    private static final Pattern USER_AUTHENTICATED_PATTERN = 
      Pattern.compile("/user/(?<routing>.*)/(?<dest>.+?)"); 

    @Override 
    public UserDestinationResult resolveDestination(Message<?> message) { 
     SimpMessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, SimpMessageHeaderAccessor.class); 

     final String destination = accessor.getDestination(); 
     final String authUser = accessor.getUser() != null ? accessor.getUser().getName() : null; 

     if (destination != null) { 
      if (SimpMessageType.SUBSCRIBE.equals(accessor.getMessageType()) || 
        SimpMessageType.UNSUBSCRIBE.equals(accessor.getMessageType())) { 
       if (authUser != null) { 
        final Matcher authMatcher = USER_AUTHENTICATED_PATTERN.matcher(destination); 
        if (authMatcher.matches()) { 
         String result = String.format("/%s/users.%s.%s", 
           authMatcher.group("routing"), authUser, authMatcher.group("dest")); 
         UserDestinationResult userDestinationResult = 
           new UserDestinationResult(destination, Collections.singleton(result), result, authUser); 
         return userDestinationResult; 
        } 
       } 
      } 
      else if (accessor.getMessageType().equals(SimpMessageType.MESSAGE)) { 
       final Matcher prefixMatcher = USER_DEST_PREFIXING_PATTERN.matcher(destination); 
       if (prefixMatcher.matches()) { 
        String user = prefixMatcher.group("name"); 
        String result = String.format("/%s/users.%s.%s", 
          prefixMatcher.group("routing"), user, prefixMatcher.group("dest")); 
        UserDestinationResult userDestinationResult = 
          new UserDestinationResult(destination, Collections.singleton(result), result, user); 
        return userDestinationResult; 
       } 
      } 
     } 

     return null; 
    } 
} 
:

다음은 사용자 정의 UserDestinationResolver 자체입니다

관련 문제