仅拦截来自消费者的Spring Cloud Stream消息

时间:2017-11-30 04:29:55

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

我目前正在使用带有GlobalChannelInterceptor的Kafka绑定器的Spring Cloud Stream来为我的Spring Boot微服务执行消息记录。

我有:

  1. 将消息发布到SubscribableChannel
  2. 的制作人
  3. 要从流中收听的消费者(使用@StreamListener注释)
  4. 在整个过程中,当消息从生产者发布到Stream并由消费者监听时,观察到preSend方法被触发了两次:

    1. 一旦生成方 - 当消息发布到Stream
    2. 一旦进入消费者端 - 从流中收听消息
    3. 但是,对于我的日志记录目的,我只需要在消费者端截取并记录消息。

      是否有办法仅在一方(例如消费者方)拦截SCS消息?

      我很感激对此事的任何想法。谢谢!

      价:

      1. GlobalChannelInterceptor文档 - https://docs.spring.io/spring-integration/api/org/springframework/integration/config/GlobalChannelInterceptor.html
      2. 修改

        生产者

        public void sendToPushStream(PushStreamMessage message) {
                try {
                    boolean results = streamChannel.pushStream().send(MessageBuilder.withPayload(new ObjectMapper().writeValueAsString(message)).build());
                log.info("Push stream message {} sent to {}.", results ? "successfully" : "not", StreamChannel.PUSH_STREAM);
                } catch (JsonProcessingException ex) {
                    log.error("Unable to parse push stream message.", ex);
                }
            }
        

        制作人的streamChannel

        public interface StreamChannel {
        
            String PUSH_STREAM = "PushStream";
        
            @Output(StreamChannel.PUSH_STREAM)
            SubscribableChannel pushStream();
        
        }
        

        消费

        @StreamListener(StreamChannel.PUSH_STREAM)
        public void handle(Message<PushStreamMessage> message) {
            log.info("Incoming stream message from {}, {}", streamChannel.pushStream(), message);
        

        }

        消费者的streamChannel

        public interface StreamChannel {
        
            String PUSH_STREAM = "PushStream";
        
            @Input(StreamChannel.PUSH_STREAM)
            SubscribableChannel pushStream();
        
        }
        

        拦截器(公共图书馆)

        public class GlobalStreamInterceptor extends ChannelInterceptorAdapter {
        
            @Override
            public Message<?> preSend(Message<?> msg, MessageChannel mc) {
               log.info("presend " + msg);
                return msg;
            }
        
            @Override
            public void postSend(Message<?> msg, MessageChannel mc, boolean sent) {
                log.info("postSend " + msg);
            }
        
        }
        

1 个答案:

答案 0 :(得分:0)

是的,为什么不遵循GlobalChannelInterceptor选项而不适用

  

一系列与之匹配的通道名称的简单模式。

所以,你可能会有这样的事情:

@GlobalChannelInterceptor(patterns = Processor.INPUT)

或者使用输入频道的自定义名称到您的SCSt应用程序。