如何在Spring Boot中的websocket主题中使用选择器发送消息

问题描述 投票:0回答:1

澄清:

感谢@JustinBertram评论,我意识到这个问题没有意义。

STOMP协议本身不支持选择器,您必须使用实现它的ActiveMQ等代理。 STOMP支持代理可以使用的标头来过滤选择器的消息。

在我的情况下,我没有使用任何代理,只是使用Angular + Stomp + SockJS前端和Spring Boot后端,所以我不能使用选择器。

STOMP协议的文档并没有让我清楚,我感到困惑。见这些参考文献:

the specification

Stomp代理可以支持选择器头,它允许您在消息头上指定SQL 92选择器,它充当基于内容的路由的过滤器。

this article

subscribe()方法采用可选的headers参数来在订阅目标时指定其他标头:

var headers = {ack: 'client', 'selector': "location = 'Europe'"};
client.subscribe("/queue/test", message_callback, headers);

客户端指定它将处理消息确认,并且有兴趣仅接收与选择器位置='Europe'匹配的消息。


我正在Spring Boot中实现后端。对于与前端的双向通信,我正在使用stype over websockets。

我跟着this Spring Boot + Angular example

它有效,但我的要求之一是后端必须使用选择器发送消息,以便前端订阅主题并仅接收过滤后的数据,以避免实时数据出现性能问题。

即yaazkssvpoi

为此,我试图让后端用选择器发送消息,但我无法使它工作。

我跟着{ 'selector': "location = 'Europe'" }用选择器实现了前端,它工作正常,问题只是后端。

我尝试使用this article注释,但根据文章它似乎没有任何参数:

@SendTo

我也尝试使用@MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception { Thread.sleep(1000); return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"); } ,但我不知道如何在标题中设置选择器属性:

MessagingTemplate

http://assets.spring.io/wp/WebSocketBlogPost.html

我真的很感激任何帮助,我已经阅读了很多文章和文档,但我找不到任何与此有关的解决方案。

spring-boot spring-mvc websocket stomp
1个回答
1
投票

MessageSendingOperations<String> messagingTemplate; messagingTemplate.convertAndSend(destination, quote); 不包含关于选择器及其语法的任何特定声明,因为它实际上取决于代理实现这里支持的内容。规范现在只是陈述:

STOMP服务器可以支持其他特定于服务器的标头,以自定义订阅的传递语义。有关详细信息,请参阅服务器的文档。

像ActiveMQ 5.x和ActiveMQ Artemis这样的代理支持latest version of the STOMP specification STOMP头,选择器的语法和行为基于JMS选择器。

JMS中的选择器用于选择消耗消息并由消费客户端配置。发送消息时无法设置选择器。

JMS选择器根据消息的标题或属性选择消息,尽管某些实现超出了此范围,并允许根据消息本身的内容进行选择。因此,如果您想在消费者身上使用选择器selector,那么您应该在消息发送时使用名称location = 'Europe'和值location设置标头。

Europe方法被重载并提供了几种设置标头的方法:

© www.soinside.com 2019 - 2024. All rights reserved.