У меня возникли проблемы с работой пользовательских назначений с веб-сокетами Spring STOMP.
Кажется, у меня работает общая конфигурация. Например, следующие работы.
Клиент:
svc.stompClient.subscribe('/queue/messages', msg );
Сервер:
stompTemplate.convertAndSend("/queue/messages", msg);
Однако, когда я пытаюсь отправить в определенное место назначения пользователя следующим образом:
Клиент:
svc.stompClient.subscribe('/user/queue/messages', msg );
Сервер:
stompTemplate.convertAndSendToUser(username, "/queue/messages", msg);
... кажется, ничего не происходит.
Я настроил прослушиватели SessionConnectedEvent
и SessionSubscribeEvent
, которые показывают:
SessionConnectedEvent[GenericMessage [
payload=byte[0],
headers={
simpMessageType=CONNECT_ACK,
simpConnectMessage=GenericMessage [
payload=byte[0],
headers={
simpMessageType=CONNECT,
stompCommand=CONNECT,
nativeHeaders={
accept-version=[1.1,1.0],
heart-beat=[10000,10000]
},
simpSessionAttributes={},
simpSessionId=erlz0dm6
}
],
simpSessionId=erlz0dm6
}
]]
SessionSubscribeEvent[GenericMessage [
payload=byte[0],
headers={
simpMessageType=SUBSCRIBE,
stompCommand=SUBSCRIBE,
nativeHeaders={
id=[sub-0],
destination=[/user/queue/messages]
},
simpSessionAttributes={},
simpSubscriptionId=sub-0,
simpSessionId=erlz0dm6,
simpDestination=/user/queue/messages
}
]]
И на стороне клиента я вижу следующее:
>>> SUBSCRIBE
id:sub-0
destination:/user/queue/messages
Проследив путь через метод sendToUser
, я вижу, что он передает /user/myusername/queue/messages
целевому преобразователю. Однако на сервере больше ничего не регистрируется, и клиент не получает сообщение.
Итак, я стремлюсь определить:
- Есть ли какое-либо ведение журнала отладки, которое я мог бы включить, что могло бы помочь в диагностике проблемы?
- Существуют ли какие-либо общие ловушки конфигурации, в которые я мог попасть?
Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация (например, код), которую я мог бы предоставить, чтобы помочь в диагностике проблемы. Вопрос уже достаточно длинный, поэтому я стараюсь не загромождать его лишними кодами.
Я использую:
- Spring Boot 1.2.1 (такая же проблема с 1.0.8. Я обновился, чтобы посмотреть, может ли это помочь.)
- sockjs-клиент 0.3.4
- топать-веб-сокет 2.3.1
Кроме того, если это уместно, я использую PreAuthenticatedAuthenticationProvider
для определения пользователя и HttpServletRequestWrapper
для обеспечения того, чтобы имя пользователя, определенное в заголовке, предоставлялось как имя Principal
. т. е. имя пользователя в приведенном выше коде — это мое имя пользователя домена Active Directory.
Примечание. Я изучил этот вопрос, что звучит немного похоже. Однако их «рабочий код» — это то, что я безуспешно пытаюсь заставить работать.