我创建了一个弹出启动应用程序,通过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提供)?如何禁用它?
答案 0 :(得分:1)
当你@Autowired SubscribableChannel
时,应用程序上下文中应该有一个。这可能会让人感到困惑和误导,但Spring Integration为全局PublishSubscribeChannel
提供errorChannel
:https://docs.spring.io/spring-integration/docs/5.0.2.RELEASE/reference/html/messaging-channels-section.html#channel-special-channels
这个作为默认订阅者有LoggingHandler
个记录错误。
我不认为根据errorChannel
制作逻辑是可以的。
您应该考虑声明自己的MessageChannel
bean,并通过特定的@Qualifier
注入它。