澄清:
感谢@JustinBertram评论,我意识到这个问题没有意义。
STOMP协议本身不支持选择器,您必须使用实现它的ActiveMQ等代理。 STOMP支持代理可以使用的标头来过滤选择器的消息。
在我的情况下,我没有使用任何代理,只是使用Angular + Stomp + SockJS前端和Spring Boot后端,所以我不能使用选择器。
STOMP协议的文档并没有让我清楚,我感到困惑。见这些参考文献:
Stomp代理可以支持选择器头,它允许您在消息头上指定SQL 92选择器,它充当基于内容的路由的过滤器。
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
我真的很感激任何帮助,我已经阅读了很多文章和文档,但我找不到任何与此有关的解决方案。
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
方法被重载并提供了几种设置标头的方法:
convertAndSend
方法。convertAndSend
并将其传递给MessagePostProcessor
方法。在后处理器中,您可以调用convertAndSend
方法。