SpringBoot 整合 RabbitMQ

简单整合

在SpringBoot中使用RabbitMQ主要包括以下步骤:

  1. 添加依赖
    在SpringBoot项目的pom.xml文件中添加以下依赖:
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  1. 配置RabbitMQ
    在application.properties或者application.yml配置文件中添加RabbitMQ的配置,如下:
properties 复制代码
spring.rabbitmq.host=本机地址
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
  1. 创建RabbitMQ相关的Java配置类
java 复制代码
@Configuration
public class RabbitConfig {

    @Bean
    public Queue Queue() {
        return new Queue("hello");
    }

}
  1. 生产者发送消息
java 复制代码
@Service
public class Sender {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        String context = "hello " + new Date();
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("hello", context);
    }

}
  1. 消费者接收消息
java 复制代码
@Component
@RabbitListener(queues = "hello")
public class Receiver {

    @RabbitHandler
    public void process(String hello) {
        System.out.println("Receiver  : " + hello);
    }

}

注意:@RabbitListener注解定义了该类需要监听的队列名,@RabbitHandler注解用于标注用于消息处理的方法。

  1. 测试发送和接收消息
    我们可以在SpringBoot的启动类中注入Sender,并调用send方法发送消息,如下:
java 复制代码
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    private Sender sender;

    @Override
    public void run(String... args) throws Exception {
        sender.send();
    }

}

运行SpringBoot应用,观察控制台打印的日志,我们可以看到发送的消息和接收的消息。

好的,以下是发布/订阅模式和路由模式的示例代码:

一、发布/订阅模式

  1. 配置类(定义交换器,队列,并将队列绑定到交换器)
java 复制代码
@Configuration
public class FanoutRabbitConfig {
    @Bean
    public Queue AMessage() {
        return new Queue("fanout.A");
    }

    @Bean
    public Queue BMessage() {
        return new Queue("fanout.B");
    }

    @Bean
    public Queue CMessage() {
        return new Queue("fanout.C");
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");
    }

    @Bean
    Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(AMessage).to(fanoutExchange);
    }

    @Bean
    Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(BMessage).to(fanoutExchange);
    }

    @Bean
    Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(CMessage).to(fanoutExchange);
    }
}
  1. 发送消息
java 复制代码
public class FanoutSender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        String context = "hi, fanout msg ";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("fanoutExchange","", context);
    }
}
  1. 接收消息
java 复制代码
@Component
@RabbitListener(queues = "fanout.A")
public class FanoutReceiverA {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("FanoutReceiverA  : " + msg);
    }
}
@Component
@RabbitListener(queues = "fanout.B")
public class FanoutReceiverB {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("FanoutReceiverB  : " + msg);
    }
}
@Component
@RabbitListener(queues = "fanout.C")
public class FanoutReceiverC {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("FanoutReceiverC  : " + msg);
    }
}

二、路由模式

  1. 配置类(定义交换器,队列,并将队列绑定到交换器)
java 复制代码
@Configuration
public class DirectRabbitConfig {
    @Bean
    public Queue directQueue1() {
        return new Queue("direct.queue1");
    }

    @Bean
    public Queue directQueue2() {
        return new Queue("direct.queue2");
    }

    @Bean
    DirectExchange directExchange() {
        return new DirectExchange("directExchange");
    }

    @Bean
    Binding bindingDirectExchange1(Queue directQueue1, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue1).to(directExchange).with("routingKey1");
    }

    @Bean
    Binding bindingDirectExchange2(Queue directQueue2, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue2).to(directExchange).with("routingKey2");
    }
}
  1. 发送消息
java 复制代码
public class DirectSender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send1() {
        String context = "hi, direct msg ";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("directExchange", "routingKey1", context);
    }

    public void send2() {
        String context = "hi, direct msg ";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("directExchange", "routingKey2", context);
    }
}
  1. 接收消息
java 复制代码
@Component
@RabbitListener(queues = "direct.queue1")
public class DirectReceiver1 {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("DirectReceiver1  : " + msg);
    }
}
@Component
@RabbitListener(queues = "direct.queue2")
public class DirectReceiver2 {
    @RabbitHandler
    public void process(String msg) {
        System.out.println("DirectReceiver2  : " + msg);
    }
}

以上代码示例中,"directExchange" 和 "routingKey1"、"routingKey2" 都是我随意定义的名称,你可以根据你的实际需求来定义。

相关推荐
FIN技术铺15 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小码的头发丝、40 分钟前
Spring Boot 注解
java·spring boot
午觉千万别睡过43 分钟前
RuoYI分页不准确问题解决
spring boot
2301_811274311 小时前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
编程重生之路2 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
politeboy2 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
世间万物皆对象9 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
qq_174482857510 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
代码小鑫12 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖12 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring