获取 Spring Broker Relay 内部使用的 stomp 客户端

Get the stomp client used internally by Spring Broker Relay

我正在尝试在 Spring 中设置代理中继,其中 RabbitMQ 是代理。当所有事件都源自我的浏览器时,一切都会按预期进行,但是,有时我会在服务器端动态生成事件。我也想将这些发送到 RabbitMQ,以利用诸如持久主题或消息 TTL 之类的东西。就我的理解而言,使用 SimpleMessagingTemplate.convertAndSend()convertAndSendToUser 最终都会将事件发送到浏览器而不是代理。

截至目前,我正在尝试为 rabbitmq 创建一个新的 stomp 客户端并通过它发送事件。但我不禁觉得它有点hacky。有什么方法可以控制 Spring 使用的 stomp 客户端并轻松转发我的消息?或者我在这里遗漏了什么?

感谢任何帮助,谢谢!

花了一段时间,但事实证明您不需要掌握内部 stomp 客户端(尽管它实际上是来自 Reactor Netty 的内部 TcpClient)或类似的东西。以下是您需要进行一些自定义时需要执行的步骤:

  • Spring 使用 @EnableWebSocketMessageBroker 配置代理,或者您可以扩展 DelegatingWebSocketMessageBrokerConfiguration。我最终扩展了它,不过没什么区别。
  • configureMessageBroker(MessageBrokerRegistry registry)中,使用注册表并启用stomp中继和重要部分:对于相同方法的注册表,添加ChannelInterceptors。您可以获取 stomp 命令并根据需要进行处理。这个想法与 Spring Intercetpors 相同。在其中添加所需的 headers。

    最终 StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(消息); StompCommand 命令 = headerAccessor.getCommand();

最后,重新创建要发送的消息。

MessageBuilder.createMessage(new byte[0], accessor.getMessageHeaders());

最后,您可以测试是否真正进入了 RabbitMQ 管理控制台,以观察消息是否真正被发送。