首页 > 其他分享 >RabbitMQ 学习笔记 - 1

RabbitMQ 学习笔记 - 1

时间:2024-02-03 18:23:04浏览次数:29  
标签:rabbitmq 队列 factory 笔记 学习 Connection RabbitMQ 消息

RabbitMQ 的基础概念
生产者
产生数据发送消息的程序是生产者

交换机
交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切的知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得由交换机类型决定。

队列
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式。

消费者
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在一个机器上。同一个应用程序既可以是生产者又可以是消费者。

RabbitMQ 名词介绍

Broker:接收和分发新消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似与网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ Server 提供的服务时,可以划分出多个 vhost,多个用户在自己的 vhost 创建 exchange / queue 等。
Connection:Producer 和 Channel 与 broker 之间的连接。
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 Connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 Thread 建立单独的 Channel 进行通讯。AMQP 包含了 channel id 帮助客户端和 Message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP Connection 的开销。
Exchange:Message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发到 queue 中去。常用的类型有:direct(point-to-point), topic (publish-subscribe) and fanout (multicast)
Queue:消息最终被放到这里等待被 comsumer 取走。
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含有 routing key,binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。

消息生产者

package com.kwin.rabbitmq.one;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: huowenhao
 * @Date: 2022/1/18
 * @Description: com.kwin.rabbitmq.one
 * @version: 1.0
 */
public class Producer {

    //队列名称
    private static final String QUEUE_NAME = "hello";

    //发消息
    public static void main(String[] args) throws IOException, TimeoutException {

        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂ip 连接RabbitMQ的队列
        factory.setHost("119.91.219.72");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("a123456");

        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();

        /**
         * 生成一个队列
         * 1.队列名称
         * 2.队列里面的消息是否持久化(磁盘) 默认情况下存储在内存中
         * 3.该队列是否只供一个消费者进行消费,是否可以消息共享,true可以多个消费者消费, false只能一个消费者消费
         * 4.是否自动删除 最后一个消费者断开连接之后,该队列是否自动删除 true自动删除 false不自动删除
         * 5.其他参数
         */
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        //发消息
        /**
         * 发送一个消息
         * 1.发送到那个交换机
         * 2.路由的key值是那一个 本次是队列名称
         * 3.其他参数信息
         * 4.发送消息的消息体
         */
        String message = "hello world";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

        System.out.println("消息发送完毕");

    }
}

消息消费者

package com.kwin.rabbitmq.one;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: huowenhao
 * @Date: 2022/1/18
 * @Description: com.kwin.rabbitmq.one
 * @version: 1.0
 */
public class Consumer {

    //队列名称
    private static final String QUEUE_NAME = "hello";

    //接收消息
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂ip 连接RabbitMQ的队列
        factory.setHost("119.91.219.72");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("a123456");

        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();

        //声明
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println(new String(message.getBody()));
        };
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("消息消费被中断");
        };


        /**
         * 消费者消费消息
         * 1.消费哪个队列
         * 2.消费成功之后是否要自动应答,true代表自动应答,false代表手动应答
         * 3.消费者未成功消费的回调
         * 4.消费者取消消费的回调
         */
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
    }
}

 

标签:rabbitmq,队列,factory,笔记,学习,Connection,RabbitMQ,消息
From: https://www.cnblogs.com/otf-notes/p/18005030

相关文章

  • C语言-malloc学习
    学习网址C语言动态内存函数(malloc、calloc、realloc、free)详解:https://www.jb51.net/program/295325hjh.htmC语言动态内存函数详解:https://www.jb51.net/article/223725.htm在C语言中,动态内存函数是块重要的知识点,以往,我们开辟空间都是固定的。数组编译结束后就不能继续给它开......
  • 【阅读笔记】对比度增强-《Efficientcontrast enhancement using adaptive gamma corr
    2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)提出了一种自动映射技术,通过亮度像素的伽马校正和概率分布来提高调暗图像的亮度。为了增强视频,所提出的图像增强方法使用关于每帧之间差异的......
  • C语言学习9
    前面写float的数据类型后,输入0.0,编译器默认是double类型的变量,后加f才是floatgoto语句上述例子死循环,goto=飞雷神苦无.....但使用多了,程序出现的BUG也会增多,其次也不能跨函数跳转,如下:真正适用场景例子:预备:shutdown-s:关机,shutdown-t:定时关机,(注意空格);shutdown-a:取消关机左上角注:......
  • 【阅读笔记】对比度增强-《Efficientcontrast enhancement using adaptive gamma corr
    2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)提出了一种自动映射技术,通过亮度像素的伽马校正和概率分布来提高调暗图像的亮度。为了增强视频,所提出的图像增强方法使用关于每帧之间差异的......
  • Pandas库学习笔记(4)---Pandas DataFrame
    PandasDataFrame  PandasDataFrame基本操作DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐。DataFrame的功能潜在的列是不同类型的大小可变标记的轴(行和列)可以对行和列执行算术运算结构体pandas.SeriesSeries结构如下: 让我们假设我们正在使用学生的数......
  • [算法学习笔记] 欧拉路
    免责声明:本文定义并不严谨,笔者是从“浅显易懂”的角度出发写本文。若您需要严谨定义请移步至其他学术文章。基本定义欧拉路径,即能不重不漏经过图上所有边的路径。也可以说“一笔画问题”。特殊地,如果这条路径的起点和终点一致,则这条路径叫做“欧拉回路”。其他的定义:欧拉图......
  • Java套接字编程学习
    一、前言Java套接字编程用于不同JRE上运行的应用程序之间进行通信,可以是面向连接或无连接的。Socket类和ServerSocket类用于面向连接的套接字编程,DatagramSocket类和DatagramPacket类用于无连接的套接字编程。我们需要根据服务器IP地址和端口号来区分套接字。Socket类用于客户端和......
  • Pandas库学习笔记(3)---Pandas Series
    PandasSeriesPandasSeries基本操作pandas.SeriesSeries结构如下:pandas.Series(data,index,dtype,copy)构造函数的参数如下-data:数据采用各种形式,例如ndarray,list,常量index:索引值必须是唯一且可哈希的,且长度与数据相同。如果未传递索引,则默认为np.arrange(n)。dt......
  • Postman学习第2天心得记录
    经过昨天的学习,我对Postman有了基本的了解。今天,我进一步深入探索了它的功能和用法。今天的学习重点是如何利用环境变量、集合和测试脚本提升测试效率。环境变量允许我为不同的环境(如开发、测试、生产)设置不同的值,这样我就可以在不更改代码的情况下轻松切换环境。通过创建集合,我可......
  • pygame学习(一)——pygame库的导包、初始化、窗口的设置、打印文字
    导语 pygame是一个跨平台Python库(pygamenews),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。使用pygame,理论上可以开发设计市面上所有的2D类型游戏。优点:pygame免费、开源,支持多种操作系统,具有......