Spring集成LoggingHandler将所有消息记录到Error

问题描述 投票:0回答:1

我创建了一个弹簧启动应用程序,通过Message发送PublishSubscribeChannels。此频道作为SubscribableChannel接口“自动装配”。我只订阅了一个MessageHandler到这个频道,一个KafkaProducerMessageHandler

我的问题是订阅了一个额外的MessageHandler,这是一个LoggingHandler。它用ERROR级别实例化。所以我看到记录的每条消息都是错误的。

我想知道这个LoggingHandler连接(实例化)的原因和位置以及为什么要订阅该频道 - 我想禁用它。

(我调试了一下但是(实际上没有用):LoggingHandler在KafkaHandler之后被实例化并订阅。我看到这个链EventdrivenConsumer.doStart()

编辑

正如评论中所建议的那样是一些代码(我无法共享整个项目)。我的问题是代码无法解释行为。由于某些未知原因,LoggingHandler正在订阅我的PublishSubscribeChannel,并且由于某种未知原因而将其作为级别实例化。

订阅KafkaHandler的类:

@Component
public class EventRelay  {

    @Autowired
    private EventRelay( SubscribableChannel eventBus, @Qualifier( KafkaProducerConfig.KAFKA_PRODUCER ) MessageHandler kafka ) {

        eventBus.subscribe( kafka );

    }
}

发送事件的类正在实现具有许多回调方法的专有接口:

public class PropEvents implements PropClass.IEvents {

    private SubscribableChannel eventBus;
    private final ObjectMapper om;
    private final String userId;


    public PropEvents( SubscribableChannel eventBus, ObjectMapper om, String userId ) {

        this.eventBus = eventBus;
        this.om = om;
        this.userId = userId;
    }

    @Override
    public void onLogin(  ) {
                 eventBus.send( new OnLoginMessage(... ) ) );
    } 
    //many other onXYZ methods
}

这是生成PropEvents实例的Factory:

@Configuration
public class EventHandlerFactory {

    private final ObjectMapper om;
    private final SubscribableChannel eventBus;

    @Autowired
    public EventHandlerFactory( ObjectMapper om, SubscribableChannel eventBus){
        this.om = checkNotNull( om );
        this.eventBus = checkNotNull( eventBus );
    }

    @Bean
    @Scope( SCOPE_PROTOTYPE)
    public IEvents getEvantHandler(String userId){
        if(Strings.isNullOrEmpty(userId)){
            throw new IllegalArgumentException( "user id must be set." );
        }
        return new PropEvents(eventBus, om, userId);
    }

}

我感谢任何有关调试或使用工具的帮助(例如,Eclipse Spring工具没有显示对LoggingHandler Bean的任何提示),以查找LoggingHandler实例化和订阅我的自动装配通道的位置和原因。

我目前的解决方法是禁用LoggingHandler的日志记录。

我的问题一目了然为什么spring实例化一个具有错误级别的LoggingHandler并将其订阅到我的SubscribableChannel(由PublishSubscribeChannel提供)?如何禁用此功能?

spring-boot logging spring-integration
1个回答
1
投票

当你@Autowired SubscribableChannel时,应用程序上下文中应该有一个。这可能会让人感到困惑和误导,但Spring Integration为全球PublishSubscribeChannel提供了errorChannelhttps://docs.spring.io/spring-integration/docs/5.0.2.RELEASE/reference/html/messaging-channels-section.html#channel-special-channels

这个有一个LoggingHandler记录错误作为默认订阅者。

我不认为根据errorChannel制作你的逻辑是可以的。

您应该考虑申报自己的MessageChannel bean并通过特定的@Qualifier注入它。

© www.soinside.com 2019 - 2024. All rights reserved.