我有一个关于这个问题的后续问题
有没有办法在 Spring Cloud Stream 中自定义 Spring Integration 模块的 LoggingHandler ?即,将 shouldLogFullMessage 设置为 false 或将 logExpression 设置为最小值?可以在 application.yaml 中的活页夹/绑定配置中完成。因为现在即使已经设置了 DLQ 并且设置了错误处理程序定义,日志记录处理程序也会使用完整的有效负载记录消息。不想通过设置日志级别来静音日志。只是想减少logginghandler的日志内容可能是为了@sobychacko
Spring Cloud Stream 完全依赖于 Spring Integration 提供的任何相关内容。因此,Spring Integration 创建一个
errorChannel
(如果尚不存在),并使用一些默认值订阅它 LoggingHandler
:
this.registry.registerBeanDefinition(errorLoggerBeanName,
BeanDefinitionBuilder.genericBeanDefinition(LoggingHandler.class)
.addConstructorArgValue(LoggingHandler.Level.ERROR)
.addPropertyValue(IntegrationNamespaceUtils.ORDER, Ordered.LOWEST_PRECEDENCE - 100)
.getBeanDefinition());
所以,是的,你是对的:没有办法自定义默认值
LoggingHandler
。请随意提出 Spring Integration 的 GH 问题:我们需要考虑这个默认的 LoggingHandler
是否必须通过配置属性进行自定义。
现在的解决方案是这样的:
@Bean
PublishSubscribeChannel errorChannel() {
return new PublishSubscribeChannel();
}
@Bean
@ServiceActivator(inputChannel = "errorChannel")
LoggingHandler errorLoggingHandler() {
LoggingHandler loggingHandler = new LoggingHandler(LoggingHandler.Level.ERROR);
loggingHandler.setLogExpression(new FunctionExpression<ErrorMessage>(m -> m.getPayload().getMessage()));
return loggingHandler;
}
这样我们就可以覆盖默认情况下 Spring Integration 中可以完成的任何操作。另外,请注意在 Java 中执行此操作更加清晰,而不是我们会尝试从配置属性中确定表达式可能出现的问题。因此,我还不太确信我们应该通过 bean 覆盖来公开这些属性,而不是长期存在的解决方案:https://docs.spring.io/spring-integration/reference/error-handling.html