技术分享 RabbitMQ 学习笔记 -- 02 一个 HelloWorld

thaddeus · 2020-10-24 10:14:12 · 热度: 34

一,介绍

  • RabbitMQ:它不处理信息,而是接收、存储和转发二进制的数据信息块,包含 exchange 交换机和 queue 队列模块

  • producer

    :生产只意味着发送。发送消息的程序是生产者

  • queue

    :信息流经 RabbitMQ 与对应程序,但它们只能存储在队列中。队列只受主机的内存和磁盘限制的约束,它本质上是一个很大的消息缓存区。生产者们可以将信息发送到一个队列,然后消费者们可以从队列中接收数据

  • consumer

    :消费者从队列中获取数据信息,交给等待接收消息的应用程序进行处理,与生产者无关!

生产者、消费者和 RabbitMQ 中间件不用处在同一个主机上,可以分别部署。应用程序可以既是生产者,也是消费者

二、web 控制台操作

创建队列:

Name:队列名字

Durability:队列持久性规则 1.Durable(持久保存) 2.Transient(临时保存)

Auto delete:1.No 2.Yes 如果 Yes,队列将在至少一个消费者连接之后删除自己,然后所有消费者断开连接。

Arguments:队列参数

在队列中发布一条消息:

Delivery mode:消息传递模式 1. Non-persistent 2.Persistent 信息是否持久化,Persistent 时,代表发布的消息时持久的;Non-persistent 时,重启 RabbitMQ ,队列信息丢失

扩:在接收者接收消息并处理的时候会出现各种各样的问题:抛出异常导致与RabbitMQ连接断开,程序挂掉,网络问题等等。
往往在出现这些问题的时候我们通常都希望队列能保存这些消息,并在程序再次起来的时候能够重新处理,或如果是负载均衡的模式下,能够把这个消息重新分配给其他的同等的接受者来处理。这同样也是RabbitMQ对消息持久化的一种功能。

Headers:消息请求头参数,

Properties:其他消息属性

Payload:消息主体内容

发布成功后,我们可以看到在队列里保存了一条消息:

获取队列中的信息:

在队列获取消息是一个破坏性的操作,但是我们为了便于直观学习,在此进行页面消费信息。

Ack mode:消息确认模式,1.Nack message requeue true 该方式获取消息不会从队列删除消息 2.Ack message requeue false 该方式每次获取一条消息后,会从队列移除该消息 3.reject requeue true 消费者拒绝该条消息,并重入队列给下一个订阅的消费者消费 4.reject requeue false 消费者拒绝该条消息,并将之丢弃

三、代码方式

首先引入 RabbitMQ 的 Java spring 客户端依赖,使用 Spring Boot 来引导和配置 Spring AMQP 项目。选择 Maven 来构建这个项目,主要引入:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>
复制代码

yaml:填写相应的字段属性

spring:
  rabbitmq:
    host: 192.168.159.129
    port: 5672
    username: admin
    password: admin

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

创建 hello 队列

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    @Bean
    public Queue queue() {
        return new Queue("hello");
    }
}

消费者—-这里采用 @RabbitListener 注解进行监听 hello 队列,后面会谈谈 @RabbitListener 的用法:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {
    @RabbitListener(queues = "hello")
    public void receive(String msg) {
        System.out.println("消费者消费信息:" + msg);
    }
}

生产者—-我们在测试类中编写生产者代码:

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void producer() {
    String routingKey = "hello";
    String msg = "隔壁超市薯片半价啦!";
    rabbitTemplate.convertAndSend(routingKey, msg);
}

控制台输出:

消费者消费信息:隔壁超市薯片半价啦!

为您推荐与 rabbitmq 相关的帖子:

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册