如何在 spring-amqp 中设置消费者标签值

How to set the consumer-tag value in spring-amqp

我正在尝试更新消费者标签,使其比随机生成的字符串包含更多信息。我们有一个我们使用的模式,包括主机名 + 标识符 + 随机字符串。这在我们的其他服务(即:带有 ampqlib 的 NodeJS)中运行良好,因为它们提供了一种传递此值的机制。

但是,对于我们的 Java 服务,我们使用 spring-amqp 并且似乎无法传递消费者标签值。我看了一下 BlockingQueueConsumer,它目前被硬编码为一个空字符串:

String consumerTag = this.channel.basicConsume(queue, this.acknowledgeMode.isAutoAck(), "", false, this.exclusive,
            this.consumerArgs, this.consumer);

除了创建我们自己的消费者类型之外,还有什么方法可以让它不为空字符串(这将导致随机生成一个)?

谢谢!

你是对的;目前不可配置;请打开一个 Improvement JIRA,我们将看看如何添加它。应该不会太费力。

编辑

如果使用@RabbitListener,只需将策略实现添加到侦听器容器工厂即可;这是一个 @FunctionalInterface 所以你可以使用一个 lambda,例如 Spring Boot:

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
        SimpleRabbitListenerContainerFactoryConfigurer configurer,
        ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setConsumerTagStrategy(q -> "myConsumerFor." + q);
    return factory;
}

@RabbitListener(queues = "foo")
public void listen(String in) {
    System.out.println(in);
}

如果直接连接容器,只需将其添加到容器即可。

Docs here.

它也适用于基本的 amqp java 库(对于那些没有 spring-amqp 的库)。当调用 basicConsume 方法时,它可以接收一个 String 参数,该参数将表示要使用的消费者标签。如果它为空或 null,它将使用服务器生成的。您应该谨慎使用服务器范围内的唯一标签,因为使用重复标签取消消费者可能会产生不良行为。

channel.basicConsume(queueName, autoAck, "specific.tag."+System.currentTimeMillis(), deliverCallback);