如何在spring-amqp中设置consumer-tag值

时间:2015-04-22 15:13:23

标签: java amqp spring-amqp

我正在尝试更新使用者标记,使其比随机生成的字符串更具信息性。我们使用的模式包括主机名+标识符+随机字符串。这在我们的其他服务(即:具有ampqlib的NodeJS)中工作正常,因为它们提供了传递此值的机制。

但是,对于我们的Java服务,我们使用spring-amqp,看起来无法传递消费者标记值。我查看了BlockingQueueConsumer,它目前被硬编码为空字符串:

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

除了创建我们自己的消费者类型之外,有没有办法让它不是一个空字符串(这将导致一个随机生成的字符串)?

谢谢!

2 个答案:

答案 0 :(得分:4)

你是对的;它目前不可配置;请打开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);
}

ScreenShot

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

Docs here

答案 1 :(得分:0)

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

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