Here is an example for configuration:
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class NotificationsWebSocketConfig implements WebSocketMessageBrokerConfigurer {
....
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (isNull(accessor) || isNull(accessor.getCommand())) {
log.warn("Unable to subscribe/unsubscribe: accessor or command is empty.");
return message;
}
switch (accessor.getCommand()) {
case SUBSCRIBE: {
wsSessionService.subscribe(accessor);
break;
}
case UNSUBSCRIBE:
case DISCONNECT:
case ABORT:
wsSessionService.unsubscribe(accessor);
break;
}
return message;
}
});
}
wsSessionService contains some buisness logic. This Service/component stores all active sessions and sends all notifications to destinations using something like this:
@Slf4j
@Service
@RequiredArgsConstructor
public class MessageSender {
private final ObjectMapper mapper;
private final SimpMessagingTemplate simpMessagingTemplate;
@SneakyThrows
public <T> void sendMessage(String destination, T payload) {
if (isNull(destination) || isNull(payload)) {
log.warn("Destination or payload is empty. Cannot send message.");
return;
}
Map<String, Object> headers = new HashMap<>();
headers.put("content-type", MediaType.APPLICATION_JSON_UTF8);
MessageHeaders messageHeaders = new MessageHeaders(headers);
byte[] bytes = mapper.writeValueAsBytes(payload);
Message<Object> message = MessageBuilder.createMessage(bytes, messageHeaders);
log.debug("Incoming message for to destination -> {}", destination);
simpMessagingTemplate.send(destination, message);
}
}