Как отправлять сообщения с селекторами в теме websocket в Spring Boot - PullRequest
0 голосов
/ 07 марта 2019

РАЗЪЯСНЕНИЯ:

Благодаря комментарию @JustinBertram я понял, что этот вопрос не имеет смысла.

Протокол STOMP сам по себе не поддерживает селекторы, вам нужно использовать таких брокеров, как ActiveMQ, которые его реализуют . STOMP поддерживает заголовки, которые могут использоваться брокерами для фильтрации сообщений по селекторам.

В моем случае я не использую никакого брокера, просто веб-интерфейс с Angular + Stomp + SocksJS и бэкэнд с Spring Boot, поэтому я не могу использовать селекторы.

Документация по протоколу STOMP не дает мне этого понять, и я запутался. Смотрите эти ссылки:

спецификация :

Брокеры Stomp могут поддерживать заголовок селектора, который позволяет вам укажите селектор SQL 92 в заголовках сообщений, который действует как фильтр для контентной маршрутизации.

эта статья :

Метод subscribe () принимает необязательный аргумент headers для указания дополнительные заголовки при подписке на пункт назначения:

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

Клиент указывает, что он обработает подтверждение сообщения и заинтересован в получении только сообщений, соответствующих селектору location = 'Европа'.


Я реализую бэкэнд в Spring Boot. Для двусторонней связи с внешним интерфейсом я использую stomp over websockets.

Я следовал этому Spring Boot + угловой пример

Это работает, но одно из моих требований заключается в том, что бэкэнд должен отправлять сообщения с селекторами, чтобы веб-интерфейс подписывался на тему и получал только отфильтрованные данные , чтобы избежать проблем производительности с данными в реальном времени .

т.е. { 'selector': "location = 'Europe'" }

Для этого я пытаюсь заставить бэкэнд отправлять сообщения с селекторами, но не могу заставить его работать.

Я следовал этой статье , чтобы реализовать интерфейс с селекторами, и он работает правильно, проблема только в бэкэнде .

Я пробовал с @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);

Я действительно ценю любую помощь, я прочитал много статей и документов, но я не нахожу ничего особенного, говорящего об этом с решением.

1 Ответ

1 голос
/ 08 марта 2019

последняя версия спецификации STOMP не содержит какого-либо конкретного утверждения о селекторах и их синтаксисе, потому что это действительно зависит от реализации брокера относительно того, что здесь поддерживается.Спецификация теперь просто гласит:

Серверы STOMP МОГУТ поддерживать дополнительные серверные заголовки для настройки семантики доставки подписки.За подробностями обращайтесь к документации вашего сервера.

Брокеры, такие как ActiveMQ 5.x и ActiveMQ Artemis, поддерживают заголовок selector STOMP, а синтаксис и поведение селектора основаны на селекторах JMS.

Селекторы в JMS предназначены для выбора сообщений о потреблении и настраиваются клиентом-потребителем.Вы не можете установить селектор при отправке сообщения.

Селекторы JMS выбирают сообщения на основе заголовков или свойств сообщения, хотя некоторые реализации выходят за рамки этого и позволяют выбирать на основе содержимого самого сообщения.Поэтому, если вы хотите иметь селектор location = 'Europe' для потребителя, вы должны установить заголовок сообщения при его отправке с именем location и значением Europe.

. *Метод 1023 * перегружен и предоставляет несколько способов установить заголовок:

...