5

Spring allows interception of messages for many of their products, like RestTemplate and SpringMVC. Is it possible to intercept Spring Cloud Stream messages? For both incoming and outgoing messages.

Jose Martinez
  • 11,452
  • 7
  • 53
  • 68

2 Answers2

13

Was able to intercept inbound and outbound Spring Cloud Stream messages using the GlobalChannelInterceptor annotation and ChannelInterceptor interface. See sample below.

import org.springframework.integration.config.GlobalChannelInterceptor;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.stereotype.Component;

@Component
@GlobalChannelInterceptor
public class Interceptor implements ChannelInterceptor {

    private final Logger log = LoggerFactory.getLogger(Interceptor.class);

    @Override
    public Message<?> preSend(Message<?> msg, MessageChannel mc) {
        log.info("In preSend");
        return msg;
    }

    @Override
    public void postSend(Message<?> msg, MessageChannel mc, boolean bln) {
        log.info("In postSend");
    }

    @Override
    public void afterSendCompletion(Message<?> msg, MessageChannel mc, boolean bln, Exception excptn) {
        log.info("In afterSendCompletion");
    }

    @Override
    public boolean preReceive(MessageChannel mc) {
        log.info("In preReceive");
        return true;
    }

    @Override
    public Message<?> postReceive(Message<?> msg, MessageChannel mc) {
        log.info("In postReceive");
        return msg;
    }

    @Override
    public void afterReceiveCompletion(Message<?> msg, MessageChannel mc, Exception excptn) {
        log.info("In afterReceiveCompletion");
    }

}
Jose Martinez
  • 11,452
  • 7
  • 53
  • 68
  • Doesn't work on spring cloud stream rabbit receiver side as spring rabbit binder is not PollableChannel implementation – Timmy Chiu Jul 06 '19 at 19:42
  • 1
    If it is not working with the spring cloud stream rabbit receiver side which other options do I have to intercept the message and reading for example correlation data from the message header to initialize the MDC. – Ray May 27 '20 at 12:39
0

Not sure what you mean by interception here - both examples you give are not message-based :).

But you want to get access to the full message, you can use that as argument to a @StreamListener or @ServiceActivator-annotated method. Also, Spring Cloud Stream allows you to set up a full Spring Integration pipeline, so you can add advices and everything you need - see here: https://github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL-Reference.

I would encourage you to take a look at the Spring Integration reference as well http://docs.spring.io/autorepo/docs/spring-integration/4.2.6.RELEASE/reference/html/. Spring Cloud Stream injects the channels automatically, and from there you have full freedom on how you construct your pipeline.

Hope this helps, Marius

Marius Bogoevici
  • 2,380
  • 1
  • 13
  • 14
  • Yeah I started reading the Spring Integration a few hours ago and I think the answer is GlobalChannelInterceptor. Interceptor is a common design pattern. its basically when you get hold of a request or message before or after it gets processed. – Jose Martinez May 26 '16 at 15:37
  • 1
    Yes, in that case a `@GlobalChannelInterceptor` should be helpful. – Marius Bogoevici May 26 '16 at 18:23