Я использую веб-сокеты Spring 4 на Tomcat 8, и у меня есть следующая конфигурация:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/notify">
<websocket:sockjs />
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic" />
</websocket:message-broker>
Мой контроллер Spring имеет следующий метод:
@MessageMapping("/notify/{client}")
public void pushMessage(@DestinationVariable long client, String message) {
System.out.println("Send " + message + " to " + client);
template.convertAndSend("/topic/push/" + client, message);
}
Итак, что я пытаюсь здесь сделать, так это то, что если клиент 1 хочет отправить сообщение клиенту 2, он использует /app/notify/2
. Затем контроллер Spring отправит сообщение в тему /topic/push/2
.
Я написал следующий код в своем клиенте:
var id = 1;
var sock = new SockJS('/project/notify');
var client = Stomp.over(sock);
client.connect({}, function() {
client.subscribe('/topic/push/' + id, function(message) {
console.log(message);
});
});
Соединение работает отлично, /project
- это просто корень контекста моего приложения.
У меня также есть следующий код в моем клиенте для отправки сообщения:
client.send('/app/notify/' + id, {}, "test");
Обе переменные (client
и id
) доступны, я не получаю никаких ошибок в этой части кода, и я вижу в своей консоли, что сообщение действительно отправлено:
>>> SEND
destination:/app/notify/1
content-length:4
test
Однако оператор System.out.println()
в моем контроллере никогда не выполняется, поэтому я предполагаю, что что-то не так с моими сопоставлениями контроллера или я неправильно использую конечные точки назначения (я не понимаю, почему я должен указывать здесь префикс приложения, но не при подключении к этой конечной точке).