Java 如何侦听动态创建的队列?

Java 如何侦听动态创建的队列?,java,rabbitmq,amqp,spring-amqp,spring-rabbit,Java,Rabbitmq,Amqp,Spring Amqp,Spring Rabbit,我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列中时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们 我不能使用优先级队列,因为所有用户的优先级都相同。因此,我想创建新队列,并在运行时收听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除) 浏览时,我发现可以使用RabbitAdmin动态创建队列。但问题是 如何使我的侦听器侦听在运行时创建的新短期(TTL)队列 如何使侦听器停止侦听

我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列中时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们

我不能使用优先级队列,因为所有用户的优先级都相同。因此,我想创建新队列,并在运行时收听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除)

浏览时,我发现可以使用RabbitAdmin动态创建队列。但问题是

  • 如何使我的侦听器侦听在运行时创建的新短期(TTL)队列
  • 如何使侦听器停止侦听已删除队列(在TTL时间之后)以避免异常
  • 目前,我正在使用SimpleMessageListenerContainerFactory。我也可以使用DirectMessageListenerContainer。我唯一关心的是如何与侦听器沟通动态队列的创建和删除。正在考虑使用(事件交换插件)

    spring amqp是否有支持启动/停止监听动态队列的方法。提前谢谢

        @Bean
        public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConnectionFactory(config.getConnectionFactory());
            factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
            factory.setConcurrentConsumers(1);
            factory.setMaxConcurrentConsumers(3);
            return factory;
        }
    
        @RabbitListener(id = "listener", queues = {
                "#{receiver.queues()}" }, containerFactory = "myRabbitListenerContainerFactory")
        public void listen(QueueMessage message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag,
                MessageHeaders headers) {
             //process message
        }
    
    
      [1]: https://www.rabbitmq.com/event-exchange.html
    

    这个怪人似乎正是这么做的=>

    链接中的代码:

    • rabbitMQ配置
    @配置
    公共类RabbitMqConfiguration实现RabbitListenerConfigurer{
    @自动连线
    私有连接工厂连接工厂;
    @豆子
    公共Jackson2JsonMessageConverter生产商Ackson2MessageConverter(){
    返回新的Jackson2JsonMessageConverter();
    }
    @豆子
    公共映射Jackson2MessageConverter使用者Ackson2MessageConverter(){
    返回新的MappingJackson2MessageConverter();
    }
    @豆子
    公共的rabbitmplate rabbitmplate(){
    最终RabbitTemplate RabbitTemplate=新RabbitTemplate(连接工厂);
    setMessageConverter(producerJackson2MessageConverter());
    返回兔模板;
    }
    @豆子
    公共RabbitAdmin RabbitAdmin(){
    返回新的RabbitAdmin(连接工厂);
    }
    @豆子
    公共RabbitListenerEndpointRegistry RabbitListenerEndpointRegistry(){
    返回新的RabbitListenerEndpointRegistry();
    }
    @豆子
    public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory(){
    DefaultMessageHandlerMethodFactory=新的DefaultMessageHandlerMethodFactory();
    setMessageConverter(consumerJackson2MessageConverter());
    返回工厂;
    }
    @豆子
    public MessageConverter jsonMessageConverter(){
    返回新的Jackson2JsonMessageConverter();
    }
    @凌驾
    public void configureRabbitListeners(最终RabbitListenerEndpointRegistrator){
    SimpleRableBitListenerContainerFactory=新SimpleRableBitListenerContainerFactory();
    工厂设置预取计数(1);
    出厂设置连续激活触发器(1);
    工厂设置连续事件触发器(1);
    工厂。设置连接工厂(连接工厂);
    setContainerFactory(工厂)注册处;
    setEndpointRegistry(rabbitListenerEndpointRegistry());
    setMessageHandlerMethodFactory(messageHandlerMethodFactory());
    }
    }
    
    • 接口
    公共接口RabbitQueueService{
    void addNewQueue(String queueName、String exchangeName、String routingKey);
    void addQueueToListener(字符串listenerId,字符串queueName);
    void removeQueueFromListener(字符串listenerId,字符串queueName);
    布尔checkQueueExistOnListener(字符串listenerId,字符串queueName);
    }
    
    • 服务
    @服务
    @Log4j2
    公共类RabbitQueueServiceImpl实现RabbitQueueService{
    @自动连线
    私人兔管理员兔管理员;
    @自动连线
    私有RabbitListenerEndpointRegistry RabbitListenerEndpointRegistry;
    @凌驾
    public void addNewQueue(字符串queueName、字符串exchangeName、字符串routingKey){
    Queue Queue=新队列(queueName,true,false,false);
    绑定=新绑定(
    队列名称,
    Binding.DestinationType.QUEUE,
    交换名称,
    路由键,
    无效的
    );
    rabbitAdmin.declareQueue(队列);
    rabbitAdmin.declareBinding(绑定);
    this.addQueueToListener(exchangeName,queueName);
    }
    @凌驾
    public void addQueueToListener(字符串listenerId,字符串queueName){
    log.info(“将队列:+queueName+”添加到id为:+listenerId的侦听器);
    if(!checkQueueExistOnListener(listenerId,queueName)){
    this.getMessageListenerContainerByd(listenerId).addQueueNames(queueName);
    log.info(“队列”);
    }否则{
    log.info(“给定的队列名称:+queueName+”在给定的侦听器id:+listenerId上不存在);
    }
    }
    @凌驾
    public void removeQueueFromListener(字符串listenerId,字符串queueName){
    log.info(“正在从侦听器中删除队列:+queueName+”:+listenerId);
    if(checkQueueExistOnListener(listenerId,queueName)){
    this.getMessageListenerContainerByd(listenerId).removeQueueNames(queueName);
    log.info(“从兔子管理中删除队列”);
    this.rabbitAdmin.deleteQueue(queueName);
    }否则{
    log.info(“给定的队列名称:+queueName+”在给定的侦听器id:+listenerId上不存在);
    }
    }
    @凌驾
    公共布尔checkQueueExistOnListener(字符串listenerId,字符串queueName){
    试一试{
    log.info(“正在检查侦听器id:+listenerId上是否存在queueName:+queueName+”);
    log.info(“获取队列名称”);