Spring boot 如何在SpringBoot:RabbitMQ中每个队列只配置一个使用者?

Spring boot 如何在SpringBoot:RabbitMQ中每个队列只配置一个使用者?,spring-boot,rabbitmq,spring-rabbit,Spring Boot,Rabbitmq,Spring Rabbit,应用程序概述: 可以创建多个动态队列。每个队列应该只有一个使用者。只有当消费者处理完一条消息后,消费者才应该拿起另一条消息 以下是我的配置: @EnableRabbit @Configuration public class RabbitMqSenderConfig { private static final Logger logger = LoggerFactory.getLogger(RabbitMqSenderConfig.class); @Value("${sprin

应用程序概述: 可以创建多个动态队列。每个队列应该只有一个使用者。只有当消费者处理完一条消息后,消费者才应该拿起另一条消息

以下是我的配置:

@EnableRabbit
@Configuration
public class RabbitMqSenderConfig {
    private static final Logger logger = LoggerFactory.getLogger(RabbitMqSenderConfig.class);

    @Value("${spring.rabbitmq.addresses}")
    private String addressURL;


    @Bean
    public ConnectionFactory connectionFactory() throws URISyntaxException {
        return new CachingConnectionFactory(new URI(addressURL));
    }

    /**
     * Required for executing adminstration functions against an AMQP Broker
     */
    @Bean
    public AmqpAdmin amqpAdmin() throws URISyntaxException {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public AmqpTemplate rabbitTemplate() throws URISyntaxException {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }


}
听众:

public class RabbitMqConsumer extends SimpleMessageListenerContainer {

    public void startConsumers() throws Exception {
        super.doStart();
    }
}
处理消息方法:

public void handleMessage(DeploymentJob deploymentJob) {
    // Deployment running, takes almost 10-15 minutes each
    try {
        System.out.println("deploymentJob.getSocketHandler().getSessions() -> "+deploymentJob.getSocketHandler().getSessions());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
每次创建拉请求时,我都会将详细信息发送到以
target
branch命名的队列中的rabbitMQ,这样所有拉请求都会在队列中得到验证,并且我创建了一个这样的使用者

    rabbitTemplate.convertAndSend(repoName, queue_name, deploymentJob);
    RabbitMqConsumer container = new RabbitMqConsumer();
    container.setConnectionFactory(rabbitMqSenderConfig.connectionFactory());
    container.setQueueNames(queue_name);
    container.setConcurrentConsumers(1);
    container.setMessageListener(new MessageListenerAdapter(new ConsumerHandler(), new Jackson2JsonMessageConverter()));
    container.startConsumers();
这里的问题是,它正在为队列中的每条消息创建新的使用者,这是我想要避免的。 我没有找到一种方法来限制每个队列中只有一个消费者。或者要检查使用者是否不存在,请不要创建
RabbitMqConsumer
的新实例。这可能吗

消费者部


只需使用由队列名称键入的
ConcurrentHashMap
来确定您已经有了消费者的队列;创建新使用者时,请将其添加到映射中。

另外,我如何确保仅当使用者已完成部署处理时,它才应从队列中接受新作业?如果侦听器容器的并发性为1(默认),并且您在容器线程上处理消息,它一次只能处理一个请求。您能告诉我如何处理容器线程上的消息吗?我的上述代码是否在容器线程上运行?是;只要您不在另一个线程上启动异步进程(例如,使用
TaskExecutor
),侦听器将在容器线程上运行。最后一个问题是,如果我的使用者在一段非活动期后从rabbitmq中删除,但我的映射仍保留正确的值,该怎么办?如果这是可能的,那么如何处理这部分?我能让我的消费者永远保持活跃吗?