如何拦截Spring Cloud Stream消息?

时间:2016-05-26 01:51:06

标签: java spring-cloud spring-cloud-stream

Spring允许拦截许多产品的消息,比如RestTemplate和SpringMVC。是否可以拦截Spring Cloud Stream消息?对于传入和传出消息。

2 个答案:

答案 0 :(得分:8)

能够使用GlobalChannelInterceptor注释和ChannelInterceptor接口拦截入站和出站Spring Cloud Stream消息。见下面的示例。

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");
    }

}

答案 1 :(得分:1)

不确定你在这里截取的意思 - 你提供的两个例子都不是基于消息的:)。

但是您希望能够访问完整的消息,您可以将其用作@StreamListener@ServiceActivator - 注释方法的参数。此外,Spring Cloud Stream允许您设置完整的Spring Integration管道,因此您可以添加建议和所需的一切 - 请参阅此处:https://github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL-Reference

我建议你看一下Spring Integration引用http://docs.spring.io/autorepo/docs/spring-integration/4.2.6.RELEASE/reference/html/。 Spring Cloud Stream会自动注入通道,从那里您可以完全自由地构建管道。

希望这有帮助, 的Marius