Отправлять только на определенные соединения Spring Websockets

Я использую grails/groovy, поэтому извините за странный синтаксис, я также новичок в использовании веб-сокетов, поэтому, пожалуйста, дайте мне знать, если я делаю это неправильно:

Используя весенние веб-сокеты, я могу отправлять сообщения определенным подписанным пользователям через

SimpMessagingTemplate brokerMessagingTemplate
users.each {
    brokerMessagingTemplate.convertAndSendToUser(it.id,"/topic/path",data)
}

Однако я хочу отправлять сообщения только подписавшимся пользователям, которые передали на сервер определенное значение/идентификатор сверх своего идентификатора пользователя. Соединение инициализируется при загрузке веб-страницы, поэтому я подумал, что, возможно, я мог бы добавить значение заголовка STOMP, которое передает эту информацию на сервер, и сервер отправляет сообщения только тем соединениям, которые соответствуют этому.

var socket = new SockJS("/url/stomp");
var client = Stomp.over(socket);
var headers = {'additionalId': additionalId};
client.connect({}, function() {
    client.subscribe("/user/topic/path", function (data) {
}, headers);

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


person Jeowkes    schedule 02.04.2016    source источник


Ответы (1)


Вместо использования заголовка вы можете использовать DestinationVariable так:

brokerMessagingTemplate.convertAndSend("/topic/something.${additionalId}".toString(), data)

и использовать

 @MessageMapping("/something.{additionalId}")
 protected String chatMessage(@DestinationVariable String additionalId, Principal principal, String data) { ... }

Кроме того, вы можете захотеть ограничить число подписчиков на определенный /something.{additionalId}, внедрив TopicSubscriptionInterceptor(), где вы можете проверить Principal

person erichelgeson    schedule 05.04.2016
comment
Спасибо за ответ, у меня еще не было возможности проверить это, но я прокомментирую / отмечу как ответ, когда сделаю это - person Jeowkes; 07.04.2016
comment
привет .. как насчет множественной переменной? /hello/{file}/{mycode} ? - person ; 02.03.2017