我目前正在使用带有GlobalChannelInterceptor
的Kafka绑定器的Spring Cloud Stream来为我的Spring Boot微服务执行消息记录。
我有:
SubscribableChannel
@StreamListener
注释)在整个过程中,当消息从生产者发布到Stream并由消费者监听时,观察到preSend
方法被触发了两次:
但是,对于我的日志记录目的,我只需要在消费者端截取并记录消息。
是否有办法仅在一方(例如消费者方)拦截SCS消息?
我很感激对此事的任何想法。谢谢!
价:
GlobalChannelInterceptor
文档 - https://docs.spring.io/spring-integration/api/org/springframework/integration/config/GlobalChannelInterceptor.html 修改
生产者
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);
}
}
答案 0 :(得分:0)
是的,为什么不遵循GlobalChannelInterceptor
选项而不适用
一系列与之匹配的通道名称的简单模式。
所以,你可能会有这样的事情:
@GlobalChannelInterceptor(patterns = Processor.INPUT)
或者使用输入频道的自定义名称到您的SCSt应用程序。