认识RabbitMq和RabbitMq的使用

embedded/2024/11/26 10:13:43/

1 认识RabbitMq


RabbitMQ是⼀个消息中间件,也是⼀个生产者消费者模型,它负责接收,存储并转发消息。


2.1 Producer和Consumer


Producer:生产者,是RabbitMQServer的客户端,向RabbitMQ发送消息

Consumer:消费者,也是RabbitMQServer的客户端,从RabbitMQ接收消息

Broker:其实就是RabbitMQServer,主要是接收和收发消息

如图:


2.2 Connection和Channel


Connection:连接,是客户端和RabbitMQ服务器之间的⼀个TCP连接。这个连接是建立消息传递的基础,它负责传输客户端和服务器之间的所有数据和控制信息。

Channel:通道,信道。Channel是在Connection之上的⼀个抽象层。在RabbitMQ中,⼀个TCP连接可以有多个Channel,每个Channel都是独⽴的虚拟连接。消息的发送和接收都是基于Channel的,通道的主要作用是将消息的读写操作复用到同⼀个TCP连接上,这样可以减少建立和关闭连接的开销,提高性能。

如图:


2.3 Virtualhost


Virtualhost:虚拟主机,这是⼀个虚拟概念。它为消息队列提供了⼀种逻辑上的隔离机制,对于 RabbitMQ而言,⼀个BrokerServer上可以存在多个VirtualHost。当多个不同的用户使用同一个 RabbitMQ Server提供的服务时,可以虚拟划分出多个vhost,每个用户在自己的vhost创建exchange/queue等


2.4 Queue


Queue:队列,是RabbitMQ的内部对象,用于存储消息。

如图:


2.5 Exchange


Exchange:交换机,message到达broker的第⼀站,它负责接收生产者发送的消息,并根据特定的规则把这些消息路由到⼀个或多个Queue列中

如图:


RabbitMq的使用


在这里我是在maven项目中,举例使用rabbitmq

在这里我们创建好maven项目之后呢,需要先添加依赖。

如代码:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version></dependency>

生产者代码编写步骤:

1. 建立连接

2. 开启信道

3. 声明交换机

4. 声明队列

5. 发送消息

6. 资源释放


消费者代码步骤:

1. 创建连接

2. 创建Channel

3. 声明一个队列

4. 消费信息

5. 释放资源


代码编写


定义常量类中的代码:

 public static final String HOST = "47.108.157.13";public static final int PORT = 5672;public static final String USER_NAME = "study";public static final String PASSWORD = "study";public static final String VIRTUAL_HOST = "bite";

生产者代码:

 public static void main(String[] args) throws IOException, TimeoutException {//1. 建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("47.108.157.13");connectionFactory.setPort(5672); //需要提前开放端口号connectionFactory.setUsername("study");//账号connectionFactory.setPassword("study");  //密码connectionFactory.setVirtualHost("bite"); //虚拟主机Connection connection = connectionFactory.newConnection();//2. 开启信道Channel channel = connection.createChannel();//3. 声明交换机   使用内置的交换机//4. 声明队列/*** queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,*                                  Map<String, Object> arguments)*  参数说明:*  queue: 队列名称*  durable: 可持久化*  exclusive: 是否独占*  autoDelete: 是否自动删除*  arguments: 参数*/channel.queueDeclare("hello", true, false, false, null);//5. 发送消息/*** basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)* 参数说明:* exchange: 交换机名称* routingKey: 内置交换机, routingkey和队列名称保持一致* props: 属性配置* body: 消息*/for (int i = 0; i < 10; i++) {String msg = "hello rabbitmq~"+i;channel.basicPublish("","hello", null, msg.getBytes());}System.out.println("消息发送成功~");//6. 资源释放channel.close();connection.close();}

消费者代码:

public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {//1. 创建连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("47.108.157.13");connectionFactory.setPort(5672);connectionFactory.setUsername("study");connectionFactory.setPassword("study");connectionFactory.setVirtualHost("bite");Connection connection = connectionFactory.newConnection();//2. 创建ChannelChannel channel = connection.createChannel();//3. 声明队列(可以省略)channel.queueDeclare("hello",true, false, false, null);//4. 消费消息/*** basicConsume(String queue, boolean autoAck, Consumer callback)* 参数说明:* queue: 队列名称* autoAck: 是否自动确认* callback: 接收到消息后, 执行的逻辑*/DefaultConsumer consumer = new DefaultConsumer(channel){//从队列中收到消息, 就会执行的方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:"+ new String(body));}};channel.basicConsume("hello", true, consumer);//等待程序执行完成Thread.sleep(2000);//5. 释放资源channel.close();connection.close();}


http://www.ppmy.cn/embedded/140592.html

相关文章

affine_grid转onnx issue记录

affine_grid的官方链接: torch.nn.functional.affine_grid — PyTorch 2.5 documentation [ONNX] Support affine_grid_generator Issue #30563 pytorch/pytorch GitHub import torch import torch.nn as nnclass Model(nn.Module):def __init__(self):super(Model, sel…

Linux 命令和 vi/vim 命令

Linux 命令概览 1. 文件和目录操作 列出目录内容 ls&#xff1a;列出当前目录内容ls -l&#xff1a;以长格式列出ls -a&#xff1a;显示隐藏文件ls -lh&#xff1a;以长格式和人类可读方式显示大小ls -R&#xff1a;递归列出子目录ls -d */&#xff1a;仅列出目录ls -t&#x…

Linux 从 apt / yum 更新、升级中排除 / 保留 / 阻止特定软件包

注&#xff1a;本文为 “Linux 从 apt / yum 更新、升级中排除 / 保留 / 阻止特定软件包” 的两篇相关文章合辑。 从 Yum 更新中排除特定 / 某些包的三种方法 作者&#xff1a; Magesh Maruthamuthu 译者&#xff1a; LCTT geekpi 2019-09-07 14:58 作为系统更新的一部分&am…

Linux系统编程之进程基础知识

概述 在Linux系统中&#xff0c;进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符&#xff0c;即PID&#xff0c;操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例&#xff0c;它还包含了程序运行时所需的各种资源&#xff0c;…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

基于SSM的校园订餐管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【Qt流式布局改造支持任意位置插入和删除】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、源代码二、删除代码三、扩展总结 前言 最近在做一个需求需要流式布局&#xff0c;虽然官方example里有一个流式布局范例&#xff0c;但是不能满足我的需求…

蒙特卡洛方法(Monte Carlo,MC)

目录 1 序言 2 Monte Carlo法计算积分 3 最优化计算Monte Carlo法 1 序言 蒙特卡罗方法(Monte Carlo)是由冯诺依曼和乌拉姆等人发明的&#xff0c;“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场&#xff0c;这个方法是一类基于概率的方法的统称。是一种应用随机数来进行…