RabbitMq消息队列简单的发送消息和接收消息

Rabbitmq

属于一个流行的开源消息队列系统。属于AMQP( 高级消息队列协议 ) 标准的一个实现。是应用层协议的一个开放标准,为面向消息的中间件设计。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全RabbitMQ特点

使用Erlang编写

支持持久化

支持HA

提供C# , erlang,java,perl,python,ruby等的client开发端

Rabbitmq中概念名词

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字, exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个
channel代表一个会话任务。

下面开始简单的Hello RabbitMq

首先,我们要搭建一个rabbitMq服务器,这里我为了方便,使用Docker进行部署

# 拉取rabbitmq的management版本的镜像
docker pull rabbitmq:3-management
# 运行rabbitmq容器
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq a28dlc29a835 # 这是镜像id

运行容器后,直接访问 localhost:15672 进入到以下页面就说明安装成功了

在这里插入图片描述

安装好服务器后,开始用java代码实现一个简单的发消息和接收消息的案例

1. 创建一个spring boot 项目,选择初始导入包的时候选择 Spring Web 和 Spring for RabbitMQ

在这里插入图片描述

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit-test</artifactId>
    <scope>test</scope>
</dependency>
  1. 创建 RabbitConfig 配置类
// 该注解表示当前类是一个配置对象
@Configuration
public class RabbitConfig {

    @Bean
    Queue testQueue(){
        // 队列名称
        return new Queue("testQueue");
    }

    /**
     * 交换机
     * @return
     */
    @Bean
    DirectExchange testExchange(){
        return new DirectExchange("testExchange");
    }

    /**
     * 将交换机与队列进行绑定
     */
    @Bean
    Binding testBinding(){
        return BindingBuilder
                .bind(testQueue())
                .to(testExchange())
                .with("testKey");
    }
}
  1. 创建一个Controller类
@RestController
public class SendMsgController {

    @Autowired
    private RabbitTemplate rabbitTempate;
    // 这个接口用于发送消息

    @GetMapping("/send")
    public String sendMsg(String msg) {
        rabbitTempate.convertAndSend("testExchange","testKey",msg);
        return "OK";
    }
}
  1. 入口类不做任何修改

  2. 配置文件

server.port=8081
spring.application.name=mq
spring.rabbitmq.host=121.40.176.56
# 下面为默认值,在没有修改的情况下可写可不写
#spring.rabbitmq.username=guest
#spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672

6.创建另外一个springboot项目,初始化导包的时候选择Spring Web 和 Spring for RabbitMQ

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit-test</artifactId>
    <scope>test</scope>
</dependency>
  1. 创建RabbitConfig配置类
@Configuration
public class RabbitConfig {

    @Bean
    Queue testQueue(){
        // 队列名称
        return new Queue("testQueue");
    }

    /**
     * 交换机
     * @return
     */
    @Bean
    DirectExchange testExchange(){
        return new DirectExchange("testExchange");
    }

    /**
     * 将交换机与队列进行绑定
     */
    @Bean
    Binding testBinding(){
        return BindingBuilder.
        // 绑定消息队列到交换机
        bind(testQueue()).
        to(testExchange()).
        // routingKey 为 testKey
        with("testKey");
    }

}
  1. 创建一个监听类
@Component
public class MyRabbitListener {

    // 监听testQueue这个队列
    @RabbitListener(queues = "testQueue")
    public void test(String msg){
        // 打印接收到的消息

        System.out.println(msg);
    }

}
  1. 入口类不做任何改变

  2. 配置文件

server.port=8080
spring.application.name=mq
spring.rabbitmq.host=121.40.176.56
#spring.rabbitmq.username=guest
#spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672

两个项目运行后,在浏览器地址栏里面访问localhost:8081/send?msg=helloWorld

在第二个项目的控制台里面如果有打印出来 helloWorld 就说明成功了

发布了30 篇原创文章 · 获赞 7 · 访问量 1583

猜你喜欢

转载自blog.csdn.net/qq_41946543/article/details/103376152