Spring Websocket: How intercept a message sent by SimpMessagingTemplate through any either convertAndSend or convertAndSendToUser methods?
Spring Websocket: How intercept a message sent by SimpMessagingTemplate through any either convertAndSend or convertAndSendToUser methods?
For Spring Websocket
Spring Websocket
I have the following and works fine:
private final SimpMessagingTemplate simpMessagingTemplate;
...
@Scheduled(cron="some expression")
public void sendNotification()
logger.info("sendNotification ...");
simpMessagingTemplate.convertAndSend(
"/topic/something",
new Notification(...));
logger.info("... sendNotification");
The code works fine. All the clients subscribed to that Topic
, (I am working with ActiveMQ
) are able to see the message(s) sent.
Topic
ActiveMQ
A custom class
@Component
class MessageChannelInterceptorAdapter extends ChannelInterceptorAdapter {
With all the methods @Override
was created to interception purposes.
@Override
This MessageChannelInterceptorAdapter
class is registered about infrastructure as follows:
MessageChannelInterceptorAdapter
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Autowired
@Qualifier("messageChannelInterceptorAdapter")
private ChannelInterceptorAdapter messageChannelInterceptorAdapter;
...
@Override
public void configureClientInboundChannel(ChannelRegistration registration)
registration.interceptors(messageChannelInterceptorAdapter);
WebSocketMessageBrokerConfigurer.super.configureClientInboundChannel(registration);
@Override
public void configureClientOutboundChannel(ChannelRegistration registration)
registration.interceptors(messageChannelInterceptorAdapter);
WebSocketMessageBrokerConfigurer.super.configureClientOutboundChannel(registration);
...
Even when the app works fine. The messages sent through SimpMessagingTemplate
never are intercepted by MessageChannelInterceptorAdapter
.
SimpMessagingTemplate
MessageChannelInterceptorAdapter
Note: the MessageChannelInterceptorAdapter
class works fine to intercept Stomp
events but again not for SimpMessagingTemplate
MessageChannelInterceptorAdapter
Stomp
SimpMessagingTemplate
Thus: How intercept any message sent by SimpMessagingTemplate
through either convertAndSend
or convertAndSendToUser
methods?
SimpMessagingTemplate
convertAndSend
convertAndSendToUser
What is missing? missing configuration about infrastructure or create other class extending a specific Spring class.
@Jeef Yes, about
SimpMessagingTemplate
, the interceptor only works how is expected only when exists a client listening the Destination
. Because it is Topic
in my case and there is no consumers, the message is sent but is lost and the interceptor never works.– Manuel Jordan
Aug 26 at 15:41
SimpMessagingTemplate
Destination
Topic
1 Answer
1
So as far as I can tell there isn't an easy way to do this. I had a situation where I was calling the template directly (like you). When I migrated to use an external STOMP broker I found out suddenly some of my calls were no longer valid:
/topic/sddf/traffic
is no longer a valid destination when you use Rabbit
/topic/sddf/traffic
I looked into writing my own version of the class SimpMessagingTemplate
which became too difficultly - so instead I had to manually change all the calls.
SimpMessagingTemplate
My example is in Kotlin not Java
My solution was to go with this class:
@Component
@Configurable
class MessagingTemplateWrapper
var template: SimpMessagingTemplate = ApplicationContextHolder.getContext().getBean(SimpMessagingTemplate::class.java)
private val log = LoggerFactory.getLogger(BridgeDataListener::class.java)
fun convertAndSend(dest: String, data: Any)
val rabbitDestination = dest.substring(0,11) + dest.substring(11).replace("/",".")
template.convertAndSend(rabbitDestination, data)
And anywhere where I was using the template I did this:
// var template: SimpMessagingTemplate = ApplicationContextHolder.getContext().getBean(SimpMessagingTemplate::class.java)
var template: MessagingTemplateWrapper = ApplicationContextHolder.getContext().getBean(MessagingTemplateWrapper::class.java)
So I just had a wrapper to do (maybe) what you wanted.
I don't love the solution - but it does work.
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Ever make any progress?
– Jeef
Aug 26 at 1:01