Spring integartion LoggingHandler将所有消息记录到错误

时间:2018-03-01 10:59:34

标签: spring-boot logging spring-integration

我创建了一个弹出启动应用程序,通过Message发送PublishSubscribeChannel个。这个频道是"自动连接"作为SubscribableChannel接口。 我只订阅了一个MessageHandler到这个频道,KafkaProducerMessageHandler

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

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

( 我调试了一下但是(实际上没有用): LoggingHandler在KafkaHandler之后被实例化和订阅。 我看到这个链EventdrivenConsumer.doStart()< - ``ConsumerEndpointFactoryBean.initializeEndpoint()< - ...直到反射调用 )

修改

正如评论中所建议的那样是一些代码(我无法共享整个项目)。我的问题是代码无法解释行为。由于某些未知原因,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提供)?如何禁用它?

1 个答案:

答案 0 :(得分: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注入它。