首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用RabbitTemplate模拟SimpMessagingTemplate.convertAndSendToUser?

如何使用RabbitTemplate模拟SimpMessagingTemplate.convertAndSendToUser?
EN

Stack Overflow用户
提问于 2016-09-03 07:19:02
回答 1查看 583关注 0票数 1

因此,我一直在阅读有关RabbitMQ代理的Spring Message Relay (Spring消息传递)功能的文章。我想要实现的目标如下:

有一个服务(1),它充当rabbitmq和浏览器之间的消息中继。现在可以正常工作了。我正在使用MessageBrokerRegistry.enableStompBrokerRelay来做这件事。

在后端有另一个服务(2),它将向RabbitMQ上的已知队列发送一条消息,并将该消息路由到特定用户。作为发送者,我希望能够控制消息被传递给谁。

通常,您会使用SimpMessagingTemplate来完成此操作。但问题是,消息的来源实际上无法访问该模板,因为它没有充当中继,没有使用websockets,也没有保存队列名称到会话ids的映射。

我可以想到的一种方法是,在服务1上编写一个简单的类,它将侦听所有队列并使用simp模板转发它们。然而,我觉得这不是一种理想的方式,我觉得可能已经有了一种使用Spring来实现它的方法。

你能给点建议吗?

EN

Stack Overflow用户

发布于 2017-02-21 06:17:18

This question让我想到了我面临的同样的困境。我已经开始使用一个定制的UserDestinationResolver,它得到了一个一致的主题命名方案,它只使用用户名,而不使用默认解析器使用的会话ID。

这让我可以在JS中订阅"/ user /exchange/amq.direct/current-time“,但通过一个普通的RabbitMQ应用程序发送到"/exchange/amqp.direct/users.me.current-time”(发送给一个名为“me”的用户)。

最新的源代码是here,我将它“注册”在我已有的@ as a @Bean类中。

下面是定制的UserDestinationResolver本身:

代码语言:javascript
运行
复制
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;
    }
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39301797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档