SpringBoot使用RabbitMQ实现消息队列

声明Exchange 绑定Queue到Exchange
@Configuration
public class RabbitMQConfig {

    // 设置使用的交换机
    public final static String EXCHANGE_TOP = "test";

    // 设置队列 多个队列绑定同一个Exchange
    public final static String QUEUE_MSG_1 = "topic.msg";
    public final static String QUEUE_MSG_2 = "topic.msg2";
    public final static String QUEUE_ALL = "topic.#";

    @Bean
    TopicExchange topExchange() {
        return new TopicExchange(EXCHANGE_TOP);
    }

    @Bean
    public Queue pushMsgQueue1() {
        return new Queue(QUEUE_MSG_1, false);
    }

    @Bean
    public Queue pushMsgQueue2() {
        return new Queue(QUEUE_MSG_2, false);
    }

    @Bean
    public Queue pushMsgQueue3() {
        return new Queue(QUEUE_ALL, false);
    }


    // queue绑定exchange的时候 routingKey(with())中的参数很重要 决定着这个queue会接收哪些路由key的消息
    @Bean
    Binding bindingExchangeMessage1() {
        return BindingBuilder.bind(pushMsgQueue1()).to(topExchange()).with(QUEUE_MSG_1);
    }

    @Bean
    Binding bindingExchangeMessage2() {
        return BindingBuilder.bind(pushMsgQueue2()).to(topExchange()).with(QUEUE_MSG_2);
    }

    @Bean
    Binding bindingExchangeMessage3() {
        return BindingBuilder.bind(pushMsgQueue3()).to(topExchange()).with(QUEUE_ALL);
    }
}
生产者生成消息
// 组建消息
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "message: 分诊室1号发来请求";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> manMap = new HashMap<>();
manMap.put("messageId", messageId);
manMap.put("messageData", messageData);
manMap.put("createTime", createTime);
// 将消息转换为json
ObjectMapper mapper = new ObjectMapper();
String writeValueAsString = null;
try {
    writeValueAsString = mapper.writeValueAsString(manMap);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}
// 发送消息
mRabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_TOP, RabbitMQConfig.QUEUE_MSG_2, writeValueAsString);
消费者消费消息
@Component
public class MessageConsumer {

    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "topic.#", durable = "true"),
                    exchange = @Exchange(value = "test", durable = "true", type = "topic"),
                    key = "#"
            )
    )
    public void handleMessage(@Payload String returnMessage, Channel channel, @Headers Map<String, Object> headers) {

        System.out.println("订单服务响应回来的消息是 :" + returnMessage);

        Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        // 消费完毕,手动确认消息签收
        try {
            channel.basicAck(tag, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
发布了200 篇原创文章 · 获赞 97 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/u010838785/article/details/104019545