我们遇到了其中一个消费者的问题,需要调试代码。 SimpleRabbitListenerContainerFactory允许设置ConsumerTagStrategy,它应该在日志记录期间添加标签。
@Bean
public SimpleRabbitListenerContainerFactory analyzeTransactionListenerContainerFactory(ConnectionFactory connectionFactory, AsyncTaskExecutor asyncTaskExecutor) {
connectionFactory.getVirtualHost());
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrentConsumers(2);
factory.setMaxConcurrentConsumers(4);
factory.setTaskExecutor(asyncTaskExecutor);
ConsumerTagStrategy consumerTagStrategy = new ConsumerTagStrategy() {
@Override
public String createConsumerTag(String queue) {
return queue;
}
};
factory.setConsumerTagStrategy(consumerTagStrategy);
return factory;
}
但是,日志仍然没有标记。因此,无法找到此消息所针对的队列/消费者。
LogLevel=DEBUG; category=org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; msg=Cancelling Consumer: tags=[{}], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@10.17.1.13:5672/,47), acknowledgeMode=AUTO local queue size=0;
LogLevel=DEBUG; category=org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; msg=Idle consumer terminating: Consumer: tags=[{}], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@10.17.1.13:5672/,47), acknowledgeMode=AUTO local queue size=0;
如何为SimpleMessageListenerContainer日志记录添加一些标记?
答案 0 :(得分:1)
好吧,看起来你误解了Consumer Key
了一下。来自RabbitMQ文档:
consumer-tag consumer-tag
指定使用者的标识符。消费者标签是渠道的本地标签,因此两个客户可以使用相同的消费者标签。如果此字段为空,则服务器将生成唯一标记。
客户端不得指定引用现有消费者的标签。错误代码:不允许
消费者标签仅在创建消费者的渠道内有效。即客户端不得在一个渠道中创建消费者,然后在另一个渠道中使用它。错误代码:不允许
当{0}}开始侦听提供的队列时,SimpleMessageListenerContainer
会为consumerTags填充其内部地图。如果我们正在倾听(消费)那里,我们可以从以下地方看到它们:
public String toString() {
return "Consumer: tags=[" + (this.consumerTags.toString()) + "], channel=" + channel
+ ", acknowledgeMode=" + acknowledgeMode + " local queue size=" + queue.size();
}
当然,正如你所期待的那样。
但如果我们不再使用消费者,例如Channel#basicCancel
。
或者......在闲置期间查看第二条日志消息。当你有一个额外的消费者,但没有消息。
关于此事的代码如下:
boolean receivedOk = receiveAndExecute(this.consumer); // At least one message received
if (SimpleMessageListenerContainer.this.maxConcurrentConsumers != null) {
if (receivedOk) {
.....
}
else {
consecutiveMessages = 0;
if (consecutiveIdles++ > SimpleMessageListenerContainer.this.consecutiveIdleTrigger) {
considerStoppingAConsumer(this.consumer);
consecutiveIdles = 0;
}
}
}
所以,也许你什么都不担心。而且你只看到那些额外消费者的日志。对于这种情况,您有maxConcurrentConsumers > concurrentConsumers
。