RabbitMQ 从入门到秃头 2 - SpringBoot整合RabbitMQ之生产者与消费者

3 篇文章 0 订阅
3 篇文章 0 订阅

前情提要

本章为RabbitMQ系列第二章,默认读者已经安装完成RabbitMQ。
如果还未安装,可以查看
RabbitMQ 从入门到秃头 1 - Centos7 安装RabbitMQ

总的来说,SpringBoot整合RabbitMQ需要配置的信息非常少,因为SpringBoot本身提供了spring-boot-starter-amqp 的AMQP协议支持的依赖包。

好的,话不多说,马上开始。


导入Maven依赖(生产者和消费者都需要导入)

<!-- Spring整合RabbitMQ核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

生产者(Producer)相关

在SpringBoot的核心配置文件Application.yml/properties中配置相关信息(文章使用yml文件)
####################################
#
#   RabbitMQ 生产者基本配置信息
#
####################################
spring:
  rabbitmq:
    addresses: 192.168.153.139:5672    #RabbitMQ默认的端口为5672
    username: guest                    #安装时设置了用户名密码均为guest
    password: guest
    virtual-host: /
    connection-timeout: 20000
    publisher-confirms: true           #是否需要消息确认

生产者(Producer)核心代码
/**
 * 确认消息生产者
 * @author Jackie Ke
 */
@Component
public class MessageProducer implements RabbitTemplate.ConfirmCallback{

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送信息的操作
     * @param message
     */
    public void send(RabbitMessage message) {
        if (message == null || message.getExchange() == null || message.getRoutingKey() == null) throw new IllegalArgumentException();

        // 1. 添加消息的附加消息
        MessageHeaders messageHeaders = new MessageHeaders(message.getProperties());
        Message<?> msg = MessageBuilder.createMessage(message, messageHeaders);

        // 2. 设置消费者确认消息的函数
        rabbitTemplate.setConfirmCallback(this); // 为了方便直接实现ConfirmCallback,传入this即可

        // 3. 创建消息的唯一标识
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        
        // 4. 设置消息发送完成后的回调函数
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message) throws AmqpException {
                System.out.println("-------------- 消息发送完成 --------------");
                return message;
            }
        };

        // 5. 发送消息
        rabbitTemplate.convertAndSend(message.getExchange(), message.getRoutingKey(), msg, messagePostProcessor, correlationData);
    }

    /**
     * @param correlationData 信息的唯一标识,类似ID
     * @param ack 是否成功接收
     * @param cause 如果失败,返回异常信息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息发送" + (ack ? "成功" : "失败") + ", correlationData:" + correlationData);
    }
}

消费者(Consumer)相关

server:
  port: 8081

####################################
#
#   RabbitMQ 消费者基本配置信息
#
####################################
spring:
  rabbitmq:
    addresses: 192.168.153.139:5672     # RabbitMQ默认的端口为5672
    username: guest                     # 安装时设置了用户名密码均为guest
    password: guest
    virtual-host: /
    connection-timeout: 20000
    listener:                           # 消费者核心配置
      simple:
        acknowledge-mode: manual        # 消费消息后,如何确认消息,默认为auto,即自动确认
        concurrency: 5
        prefetch: 1
        max-concurrency: 10
      hello:                            # 此处及以下为项目中需要使用到的配置信息,写在此处方便维护,在项目中使用${}引用
        exchange:
          name: hello-exchange
          durable: true
          type: topic
        key: springboot.*
        queue:
          value: queue-hello
消费者(Consumer)核心代码
/**
 * 确认消息生产者
 * @author Jackie Ke
 */
@Component
public class MessageProducer implements RabbitTemplate.ConfirmCallback{

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送信息的操作
     * @param message
     */
    public void send(RabbitMessage message) {
        if (message == null || message.getExchange() == null || message.getRoutingKey() == null) throw new IllegalArgumentException();

        // 1. 添加消息的附加消息
        MessageHeaders messageHeaders = new MessageHeaders(message.getProperties());
        Message<?> msg = MessageBuilder.createMessage(message, messageHeaders);

        // 2. 设置确认消息的函数
        rabbitTemplate.setConfirmCallback(this); // 为了方便直接实现ConfirmCallback,传入this即可

        // 3. 创建消息的唯一标识
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());

        // 4. 设置消息发送完成后的回调函数
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message) throws AmqpException {
                System.out.println("-------------- 消息发送完成 --------------");
                return message;
            }
        };

        // 5. 发送消息
        rabbitTemplate.convertAndSend(message.getExchange(), message.getRoutingKey(), msg, messagePostProcessor, correlationData);
    }

    /**
     * @param correlationData 信息的唯一标识,类似ID
     * @param ack 是否成功接收
     * @param cause 如果失败,返回异常信息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息发送" + (ack ? "成功" : "失败") + ", correlationData:" + correlationData);
    }
}

以上就是核心的配置和代码,接下来进行单元测试,真正发送信息

/**
 * 生产者单元测试类
 * @author Jackie Ke
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerTest {

    @Autowired
    private MessageProducer messageProducer;

    @Test
    public void testProduce() throws InterruptedException {

        RabbitMessage rabbitMessage = new RabbitMessage();

        Map<String, Object> properties = new HashMap<>();
        properties.put("name", "张三");
        properties.put("description", "法外狂徒");

        rabbitMessage.setExchange("hello-exchange");
        rabbitMessage.setRoutingKey("springboot.rabbit");
        rabbitMessage.setContent("Hello RabbitMQ !!!");
        rabbitMessage.setProperties(properties);

        messageProducer.send(rabbitMessage);

    }

}

如果正常运行,单元测试控制台中可以看到
生产者控制台
消费者控制台中可以看到
消费者控制台
至此,SpringBoot整合RabbitMQ的简易HelloWorld已经完成了。
源码已上传到我的Github上,可以自行下载。


如果文章有任何错误,欢迎指出~

感谢你的阅读,我们下回再见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值