2016-09-02 7 views
1

私はRabbitMQブローカでSpring Message Relay(Spring Messaging stuff)機能について読んできました。RabbitTemplateを使用してSimpMessagingTemplate.convertAndSendToUserを模倣する方法は?

rabbitmqとブラウザの間のメッセージリレーとして機能するサービス(1)があります。これは今では問題なく動作します。私はそれを行うためにMessageBrokerRegistry.enableStompBrokerRelayを使用しています。

バックエンドにもう1つのサービス(2)があると、既知のキューにメッセージがRabbitMQに送信され、そのメッセージが特定のユーザーにルーティングされます。送信者として、メッセージが配信される相手を制御する必要があります。

通常、SimpMessagingTemplateを使用してください。しかし、メッセージの発信元は実際にそのテンプレートにアクセスすることはできません。リレーとして動作していないため、Webソケットを使用していないため、キュー名のセッションIDへのマッピングが保持されていません。

私はそれをやっていると思うかもしれませんが、すべてのキューをリッスンしてsimpテンプレートを使用して転送する単純なクラスをサービス1に書き込んでいます。しかし、私はこれを行うには理想的な方法ではありませんでしたが、私はすでにSpringを使ってそれを行う方法があるように感じます。

アドバイスをお願いしますか?

答えて

1

This question私が直面していたのと同じジレンマを考​​えました。私は、デフォルトのリゾルバで使用されているセッションIDではなく、ユーザ名だけを使用する一貫したトピック命名体系に到達したカスタムUserDestinationResolverでプレイを始めました。

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そのものです

関連する問題