Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)

参考

  1. 《Spring Boot实战派》
  2. 消息队列RabbitMQ入门与5种模式详解(讲解了用户权限的问题,可以看一看)
  3. springboot(集成篇):RabbitMQ集成详解

必看

  • 如果要发送对象,发送的对象需要继承 Serializable
  • 可以创建多个消费者,消息会均匀的分配给消费者
    image
  • 任务失败后会自动重试,建议自己处理一下这方面的问题

建议

环境

  • Springboot 2.3.7.RELEASE
  • amqp(pom.xml内添加,未设置具体版本)
  • otp_win64_24.1.7(win安装文件)
  • rabbitmq-server-3.9.10(win安装文件)

正文

  1. pom.xml添加依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
</dependencies>
  1. 创建配置类、声明队列并绑定队列
/**
 * 配置mq交换器及声明队列
 * @Author 夏秋初
 * @Date 2021/11/27 19:48
 */
@Configuration
public class RabbitConfig {
    /**
     * 声明email队列
     * @return
     */
    @Bean
    public Queue userEmailVerify() {
        // true表示持久化该队列
        return new Queue("user.email.verify", true);
    }

//    /**
//     * 声明交互器 topic
//     * @return
//     */
//    @Bean
//    TopicExchange topicExchange() {
//        return new TopicExchange("topicExchange");
//    }
    /**
     * 声明交互器/交换机 direct
     * @return
     */
    @Bean
    DirectExchange directExchange() {
        return new DirectExchange("direct.exchange");
    }

    /**
     * 绑定email队列,并设置路由key,如果还有别的队列,再创建一个函数绑定即可
     * @return
     */
    @Bean
    public Binding bindingUserEmailVerify() {
        return BindingBuilder.bind(userEmailVerify()).to(directExchange()).with("user.email.verify");
    }
}
  1. 创建生产者(书上说可以发送对象,这边测试会报错不支持的格式,待文章写完后再解决)

/**
 * 发送者
 * @Author 夏秋初
 * @Date 2021/11/27 19:54
 */
@Component
public class UserEmailVerifyProducer {
    @Resource
    private AmqpTemplate amqpTemplate;
    /**
     * 发送邮件队列
     * @param userVerificationCodeEmailDto
     */
    public void sendEmail(UserEmailVerifyDto userVerificationCodeEmailDto){
        System.out.println("生产者 user.email.verify 发送消息: "+userVerificationCodeEmailDto);
        /**
         * 第一个参数指定交换机
         * 第二个参数指定队列
         * 第三个参数指定消息内容
         */
        amqpTemplate.convertAndSend("direct.exchange", "user.email.verify", userVerificationCodeEmailDto.toString());

    }
}

  1. 创建消费者
/**
 * 消费者
 * @Author 夏秋初
 * @Date 2021/11/27 20:23
 */
@Component
// 监听指定队列 
@RabbitListener(queues = "user.email.verify")
public class UserEmailVerifyConsumer {
    @RabbitHandler
    public void process(String content){
            System.out.println("消费者 user.email.verify  收到消息: "+content
        );
    }
}
  1. 用户实体
/**
 * @Author 夏秋初
 * @Date 2021/11/27 20:00
 */
@Data
public class UserEmailVerifyDto implements Serializable {
    private String email;
    private Integer code;
    private String content = "您的邮箱验证码为:%d,请不要告诉别人哦";
}

  1. application.properties 配置文件内添加配置参数
# 如果访问局域网的mq服务,需要配置账户并允许远程访问 ,参考:https://www.cnblogs.com/xiaqiuchu/p/15616432.html
spring.rabbitmq.host=192.168.211.2
# 指定端口号
spring.rabbitmq.port=5672
# 指定账号,默认账号不可以在其他机器登录
spring.rabbitmq.username=testmail
# 指定密码
spring.rabbitmq.password=testmail

测试

  1. 运行本项目
  2. 访问控制台可以看到该交换机
    image
  3. 点击进入交换机详情可以看到交换机内部的队列
    image
  4. 测试发送消息显示消费者接受到
    image
如果觉得文章对您有帮助,希望您能 关注+推荐 哦
原文地址:https://www.cnblogs.com/xiaqiuchu/p/15618485.html