Spring boot 动态添加队列消费者Spring问题

Spring boot 动态添加队列消费者Spring问题,spring-boot,amqp,spring-amqp,spring-rabbit,Spring Boot,Amqp,Spring Amqp,Spring Rabbit,我试图以独占模式向现有侦听器添加新队列,但遇到问题。 代码: @GetMapping(value=“/consumer”) 公众消费者(){ Set queue=newhashset(Arrays.asList(“Test queue1”、“Test queue2”、“Test queue3”); //对于(int i=0;i“+Arrays.binarySearch(queueNames,queueName)); //不要向侦听器添加相同的队列名称 if(Arrays.binarySearch

我试图以独占模式向现有侦听器添加新队列,但遇到问题。 代码:

@GetMapping(value=“/consumer”)
公众消费者(){
Set queue=newhashset(Arrays.asList(“Test queue1”、“Test queue2”、“Test queue3”);
//对于(int i=0;i<10;i++){
addQueueToListener(“测试容器1”,队列);
//        }
}
public void addQueueToListener(字符串containerId,字符串queueName){
SimpleMessageListenerContainer侦听器=(SimpleMessageListenerContainer)
rabbitListenerEndpointRegistry.getListenerContainer(containerId);
if(Objects.nonNull(侦听器)){
String[]queueNames=listener.getQueueNames();
System.out.println(“队列名称:”+Arrays.toString(queueNames)+“将添加:”+queueName);
System.out.println(“队列名称的搜索结果:“+queueName+”-->“+Arrays.binarySearch(queueNames,queueName));
//不要向侦听器添加相同的队列名称
if(Arrays.binarySearch(queueNames,queueName)<0){
System.out.println(“添加队列:+queueName”);
addQueueNames(queueName);
System.out.println(“添加的队列:+queueName”);
}
}
}
public void addQueueToListener(字符串containerId,设置queueName){
for(字符串队列:队列名称){
addQueueToListener(容器ID,队列);
}
}
兔子侦听器代码:

@RabbitListener(id=“Test container1”,queues=“#{rabbitMQConsumer.getEntriesQueueName()}”,containerFactory=“consumerBatchContainerFactory”)
public void receiveMessageBatch(列出消息)引发InterruptedException、IOException{
用于(消息:消息){
睡眠(30000);
//ObjectMapper jsonObjectMapper=新的ObjectMapper();
//Employee=jsonObjectMapper.readValue(Arrays.toString(message.getBody()),Employee.class);
字符串queueName=(字符串)message.getMessageProperties().getHeaders().get(“queueName”);
System.out.println(“RabbitMQConsumer.receiveMessage QueueName:”+QueueName);
//System.out.println(“从RabbitMQ收到的消息:“+employee+”QueueName:“+QueueName”);
}
}
公共列表getEntriesQueueName(){
返回集合。emptyList();
//返回Arrays.asList(“测试队列1”、“测试队列2”、“测试队列3”);
}
错误:当我设置listener.setIsExclusive(true)时

但同样的错误

代码参考:

有一个问题,我们最终多次回收消费者,这是一场竞赛——我们不会等待消费者被取消

使用
listener.addQueues(新队列(queueName))取而代之

另外,我将
setExclusive
移动到容器工厂bean

factory.setContainerCustomizer(container -> container.setExclusive(true));

您需要显示如何声明队列-看起来该队列上已经有另一个使用者。@GaryRussell这是完整的代码以及我使用的版本。有两个URL/生产者和/消费者。使用/消费者我面临的问题。提前谢谢。谢谢你的帮助,先生。我想知道,如果我在侦听器级别像这样使用exclusive-
@RabbitListener(id=“Test container1”,queues=“{rabbitMQConsumer.getEntriesQueueName()}”,containerFactory=“consumerBatchContainerFactory”,exclusive=true)”
,它按照您所说的方式工作,但我认为当我运行它时,它是错误的-它从队列3获取数据15次,然后从队列2获取数据10次,然后从队列2获取数据5次,然后以循环方式正常工作,即5次。为什么当我的批处理大小为5时有15条未确认的消息?设置容器的独占标志(通过工厂、容器本身或注释)的方式没有区别,它们都设置了相同的标志。我认为你观察到的行为是错误的,因为你一次只添加一个。如果在一次调用中添加所有三个调用,则效率更高(然后应该得到更均衡的分布)。
preFetchCount
需要大于或等于批大小。否则你将永远无法得到完整的批次。好的,我会检查一下。另外,我想知道哪个集装箱工厂的性能更好,或者两者都一样?批处理侦听器或具有相同大小/预取计数的简单侦听器5。否;默认值为250。直接容器更适合在运行时添加队列,因为它不会回收消费者;但它不支持批处理,因为侦听器是直接从amqp客户机线程调用的。只有在需要批量处理记录(例如,在单个事务中存储在数据库中)时,才需要批处理。
factory.setContainerCustomizer(container -> container.setExclusive(true));