如何在SimpleMessageListenerContainer.java中记录队列名称

时间:2016-02-23 17:52:59

标签: spring rabbitmq spring-amqp spring-rabbitmq

我们遇到了其中一个消费者的问题,需要调试代码。 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日志记录添加一些标记?

1 个答案:

答案 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