Enviando mensagem de erro nos websockets do Spring
Estou tentando enviar mensagens de erro nos websockets do Spring com STOMP sobre SockJS.
Estou basicamente tentando alcançar o que está sendo feitoaqui.
Este é o meu manipulador de exceções
@MessageExceptionHandler
@SendToUser(value = "/queue/error",broadcast = false)
public ApplicationError handleException(Exception message) throws ApplicationError {
return new ApplicationError("test");
}
E eu estou assinando
stompClient.subscribe('/user/queue/error', stompErrorCallback, {token: accessToken});
O usuário no meu caso não está autenticado, mas deaqui
Embora os destinos do usuário geralmente impliquem um usuário autenticado, ele não é exigido estritamente. Uma sessão do WebSocket que não está associada a um usuário autenticado pode se inscrever em um destino de usuário. Nesses casos, a anotação @SendToUser se comportará exatamente da mesma forma que com broadcast = false, ou seja, direcionar apenas a sessão que enviou a mensagem a ser tratada.
Tudo isso funciona bem quando estou lançando esse erro demyHandler
qual é o meu manipulador de Websocket definido na configuração do websocket.
eu tenho umClientInboundChannelInterceptor
que se estendeChannelInterceptorAdapter
que intercepta todas as mensagens empreSend
.
Em caso de qualquer exceção neste interceptor, quero devolvê-lo à sessão do usuário que enviou esta mensagem,
public class ClientInboundChannelInterceptor extends ChannelInterceptorAdapter {
@Autowired
@Lazy(value = true)
@Qualifier("brokerMessagingTemplate")
private SimpMessagingTemplate simpMessagingTemplate;
@Override
public Message<?> preSend(Message message, MessageChannel channel) throws IllegalArgumentException{
if(some thing goes wrong)
throw new RuntimeException();
}
@MessageExceptionHandler
@SendToUser(value = "/queue/error",broadcast = false)
public ApplicationError handleException(RuntimeException message) throws ApplicationError {
return new ApplicationError("test");
}
}
@MessageExceptionHandler
não captura essa exceção. Então, tentei enviá-lo diretamente ao usuário usandosimpMessagingTemplate
.
Eu basicamente quero fazer:
simpMessagingTemplate.convertAndSendToUser(SOMETHING,"/queue/error",e);
ALGUMA COISA deve ser o nome de usuário correto, mas o usuário não está autenticado no meu caso, portanto, não posso usarheaderAccessor.getUser().getName()
Eu até tentei com
simpMessagingTemplate.convertAndSendToUser(headerAccessor.getHeader("","/queue/error",e, Collections.singletonMap(SimpMessageHeaderAccessor.SESSION_ID_HEADER, headerAccessor.getSessionId()));
Mas isto não está funcionando.
Eu até tenteiheaderAccessor.getSessionId()
no lugar do nome de usuário, mas isso não parece funcionar.
Qual é a maneira correta de fazer isso?
O que devo usar como nome de usuário emconvertAndSendToUser
?