Little_xu
2022-06-15 14:56
采纳率: 50%
浏览 41
已结题

springboot整合RabbitMQ3.6.3版本优先队列 队列没有起作用

springboot整合RabbitMQ3.6.3版本优先队列 队列没有起作用

 问题相关代码
先创建交换机以及队列等

@Configuration
public class priorityConfig {
    //创建优先级队列等
    //交换机
    public static final String PRIORITY_EXCHANGE_NAME ="priority.exchange";
    //队列
    public static final String PRIORITY_QUEUE_NAME ="priority.queue";
    //信道
    public static final String PRIORITY_ROTING_KEY_NAME ="k1";

    //创建交换机
    @Bean
    public DirectExchange PRIORITYEXCHANGENAME(){
        return  new DirectExchange(PRIORITY_EXCHANGE_NAME);
    }
    //创建队列
    @Bean
    public Queue PRIORITYQUEUEENAME(){
//        return QueueBuilder.durable(PRIORITY_QUEUE_NAME).maxPriority(10).build();
        HashMap<String, Object> map = new HashMap<>();
        map.put("x-max-priority",10);
        return QueueBuilder.durable(PRIORITY_QUEUE_NAME).withArguments(map).build();
    }
    //创建交换机
    @Bean
    public Binding Binding(@Qualifier("PRIORITYEXCHANGENAME") DirectExchange exchange,@Qualifier("PRIORITYQUEUEENAME") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with(PRIORITY_ROTING_KEY_NAME);
    }
}

然后 编写 消息 生产者以及消费者
生产者

@RestController
@Slf4j
public class prioritycontroller {
    //交换机
    public static final String PRIORITY_EXCHANGE_NAME ="priority.exchange";
    //队列
    public static final String PRIORITY_QUEUE_NAME ="priority.queue";
    //信道
    public static final String PRIORITY_ROTING_KEY_NAME ="k1";
    @Autowired
    RabbitTemplate rabbitTemplate;

    @GetMapping("/kk")
    public void test() {
        for (int i = 0; i < 10; i++) {
            if (i == 5) {
                //1.创建消息属性
                MessageProperties messageProperties = new MessageProperties();
                //2.设置优先级
                messageProperties.setPriority(9);
                //3.创建消息对象
                Message message = new Message(("sendMessage..."+i).getBytes(),messageProperties);
                //4.发送消息
                rabbitTemplate.convertAndSend(PRIORITY_EXCHANGE_NAME,PRIORITY_ROTING_KEY_NAME,message);
            } else {
                //1.创建消息属性
                MessageProperties messageProperties = new MessageProperties();
                //2.设置优先级
                messageProperties.setPriority(1);
                //3.创建消息对象
                Message message = new Message(("sendMessage..."+i).getBytes(),messageProperties);
                rabbitTemplate.convertAndSend(PRIORITY_EXCHANGE_NAME, PRIORITY_ROTING_KEY_NAME, message );
            }
        }
    }
}
//消费者
@Component
@Slf4j
public class Consumer {
    @RabbitListener(queues = "priority.queue")
    public void receiveConfirmMessages(Message message) {
        log.info("收到了消息为:" + new String(message.getBody()));
    }
}

我先是注销这个消费者模拟一个阻塞状态 消息全部在 队列中 ,生产者发送消息 到队列 我看图形化界面也是 排好序了的 也就是说 第五条消息是在第一位

img

事实证明我是对的图形化界面 第五条消息是在第一 然后 启用消费者 发现 打印出来的消息 不是第一条 是其他消息条数

img

尝试过其他博主的方法 没有成功

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题