SpringAMQP 之 RabbitTemplate

6,846 阅读2分钟

RabbitTemplate 即消息模板

它是在之前于 SpringAMQP 整合的时候进行发送消息的关键类。

它提供了丰富的发送消息方法,包括可靠性投递消息方法、回调监听消息接口 ConfirmCallback、返回值确认接口 ReturnCallback 等等。同样我们需要进行注入到 Spring 容器中,然后直接使用。RabbitTemplate 在 Spring 整合时需要实例化,但是在 Springboot 整合时,在配置文件里添加配置即可。

代码示例:

代码地址:  https://github.com/hmilyos/rabbitmqdemo.git  rabbitmq-api 项目下

先实例化 RabbitTemplate

在 RabbitMQConfig 里面加上:
    @Bean //connectionFactory 也是要和最上面方法名保持一致
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        return rabbitTemplate;
    }

然后就在单元测试类 RabbitmqApiApplicationTests 里面写个方法发送消息

    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @Test
    public void testSendMessage() throws Exception {
        //1 创建消息
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.getHeaders().put("desc", "信息描述..");
        messageProperties.getHeaders().put("type", "自定义消息类型..");
        Message message = new Message("Hello RabbitMQ".getBytes(), messageProperties);

        rabbitTemplate.convertAndSend("topic001", "spring.amqp", message, new MessagePostProcessor() {
            @Override  // message 就是上面声明要发送的消息
            public Message postProcessMessage(Message message) throws AmqpException {
                log.info("------添加额外的设置---------");
                message.getMessageProperties().getHeaders().put("desc", "额外修改的信息描述");
                message.getMessageProperties().getHeaders().put("attr", "额外新加的属性");
                return message;
            }
        });
    }

运行单元测试,上管控台查看消息是否发送到queue里面了。如下图所示,queue接收到消息了。

在queue里面获取一下消息,看到额外设置的东西
改进一下代码,发送三个不同routingkey的消息

    @Test
    public void testSendMessage2() throws Exception {
        //1 创建消息
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType("text/plain");
        Message message = new Message("mq 消息1234   --spring.abc".getBytes(), messageProperties);

        rabbitTemplate.send("topic001", "spring.abc", message);

        rabbitTemplate.convertAndSend("topic001", "spring.amqp", "hello object message send!   -spring.amqp");
        rabbitTemplate.convertAndSend("topic002", "rabbit.abc", "hello object message send!  -rabbit.abc");
    }

再次启动测试方法,上管控台查看一下消息,本次发送了三条,加上之前未消费的一条,根据路由规则交换机 topic001 绑定 spring.* 所以 queue001 有三条消息,queue002有一条消息。

再严谨的获取一下消息内容进行确认

自此 RabbitTemplate 的 demo 演示完毕。