我正在尝试更新使用者标记,使其比随机生成的字符串更具信息性。我们使用的模式包括主机名+标识符+随机字符串。这在我们的其他服务(即:具有ampqlib
的NodeJS)中工作正常,因为它们提供了传递此值的机制。
但是,对于我们的Java服务,我们使用spring-amqp
,看起来无法传递消费者标记值。我查看了BlockingQueueConsumer
,它目前被硬编码为空字符串:
String consumerTag = this.channel.basicConsume(queue, this.acknowledgeMode.isAutoAck(), "", false, this.exclusive,
this.consumerArgs, this.consumer);
除了创建我们自己的消费者类型之外,有没有办法让它不是一个空字符串(这将导致一个随机生成的字符串)?
谢谢!
答案 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);
}
和
如果直接连接容器,只需将其添加到容器中即可。
答案 1 :(得分:0)
它也适用于基本的 amqp java 库(对于那些没有 spring-amqp 的库)。调用 basicConsume 方法时,它可以接收一个 String 参数,该参数将表示要使用的消费者标签。如果它为空或 null,它将使用服务器生成的。您应该小心使用服务器范围内的唯一标签,因为取消具有重复标签的消费者可能会产生不需要的行为。
channel.basicConsume(queueName, autoAck, "specific.tag."+System.currentTimeMillis(), deliverCallback);