Arshad Ali Arshad Ali - 3 months ago 65
Java Question

How to send message to user when he connects to spring websocket

I want to send message to user when he connects to spring websocket, I've

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Autowired
private GenervicSerice<User> userService;
@Autowired
private SimpMessagingTemplate template;
private CurrentUser currnetUser;
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
// TODO Auto-generated method stub
stompEndpointRegistry.addEndpoint("/ws").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue/", "/topic/", "/exchange/");
config.setApplicationDestinationPrefixes("/app");
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {

registration.setInterceptors(myChannelInterception());
try {
updateNotificationAndBroadcast();

} catch (Exception e) {
return;
}
}

@Bean
public MyChannelInterception myChannelInterception() {
return new MyChannelInterception();
}


private void updateNotificationAndBroadcast() {
try {
template.convertAndSend("/queue/notify", "Greetings");
} catch (Exception e) {
System.out.println("Error message is " + e.getMessage() + "\n\n\n" + "Caused by " + e.getCause()
);
}

}

}


MyChannelInterception class is

public class ImtehanChannelInterception extends ChannelInterceptorAdapter {

private CurrentUser currnetUser;

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {

MessageHeaders headers = message.getHeaders();
SimpMessageType type = (SimpMessageType) headers.get("simpMessageType");
String simpSessionId = (String) headers.get("simpSessionId");
currnetUser = new CurrentUser();
if (type == SimpMessageType.CONNECT) {
Principal principal = (Principal) headers.get("simpUser");
currnetUser.setCurrentUserEmail(principal.getName());
System.out.println("WsSession " + simpSessionId
+ " is connected for user " + principal.getName());
} else if (type == SimpMessageType.DISCONNECT) {
System.out.println("WsSession " + simpSessionId
+ " is disconnected");
}

return message;
}

}


through this I get information about new connected user but the method
updateNotificationAndBroadcast()
in
WebSocketConfig
is not sending messages to new logged-in users.

Answer

I would create SessionSubscribeEvent listener and use SimpMessagingTemplate inside.

Btw, configureClientInboundChannel is called only once (not for every user connected). So you have to handle sending message inside interceptor.

Try something like this:

@Service
public class SomeSubscribeListener {

    private SimpMessagingTemplate template;

    @Autowired
    public SomeSubscribeListener(SimpMessagingTemplate template) {
        this.template = template;
    }

    @EventListener
    public void handleSubscribeEvent(SessionSubscribeEvent event) {
        template.convertAndSendToUser(event.getUser().getName(), "/queue/notify", "GREETINGS");
    }
}

I hope this will help