como capturar o evento de inscrição no meu servidor webSocket com o Spring 4

Fiz uma comunicação simples de socket web com spring 4, STOMP e sock.js, seguindo este https://spring.io/guides/gs/messaging-stompwebsocket/

Agora quero atualizá-lo para um bate-papo simples. Meu problema é que quando o usuário se inscreve em uma nova sala de bate-papo, ele deve passar mensagens. Eu não sei como capturar o momento em que ele se inscreveu para lhe enviar a lista das mensagens.

Eu tentei usar a anotação @MessageMapping, mas não alcancei nenhum sucesso:

@Controller public class WebSocketController { @Autowired private SimpMessagingTemplate messagingTemplate; @MessageMapping("/chat/{chatId}") public void chat(ChatMessage message, @DestinationVariable String chatId) { messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("message: " + message.getText())); } @SubscribeMapping("/chat") public void chatInit() { System.out.println("worked"); int chatId = 1; //for example messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("connected")); } } 

Então eu criei isso:

 @Controller public class ApplicationEventObserverController implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { System.out.println(applicationEvent); } } 

Funciona, mas capta todos os events possíveis, não acho que seja uma boa prática.

Então, minha pergunta pode ser reformulada: como enviar dados iniciais quando o usuário está com problemas?

Você pode retornar qualquer coisa diretamente para um cliente quando ele se inscrever em um destino usando um método de manipulador @SubscribeMapping . O object retornado não irá para o intermediário, mas será enviado diretamente para o cliente:

 @SubscribeMapping("/chat") public Collection chatInit() { ... return messages; } 

No lado do cliente:

 socket.subscribe("/app/chat", function(message) { ... }); 

Confira o exemplo de bate – papo no GitHub, que mostra este cenário exato.