3、RabbitMQ_工作模式

一、简单模式

简介

简单模式 HelloWorld。一个生产者、一个消费者,不需要设置交换机使用默认的交换机。

代码示例

  • 生产者
    public class Producer {//队列名称private final static String QUEUE_NAME = "hello";public static void main(String[] args) {//建立连接工厂ConnectionFactory factory = new ConnectionFactory();//设置目标主机ipfactory.setHost("192.168.47.128");//设置账号名密码factory.setUsername("yf");factory.setPassword("123456");
    //        修改端口的设置
    //        factory.setPort();try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {//通道和队列的连接/*queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments)参数说明:queue:队列名称durable:是否持久化exclusive:是否独占,是否一个消费者监听一个队列autoDelete:是否自动删除。如果没有消费者consumer,自动删除掉队列arguments:参数*/channel.queueDeclare(QUEUE_NAME, false, false, false, null);for (int i = 0; i < 10; i++) {//需要发送的消息String message = "Hello RabbitMQ!"+i;//通过最基础的发布/*basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)参数说明:exchange:指定交换机,如果使用默认模式,就使用“”routingKey:路由名称props:配置信息body:发送的消息(要求字节数组)*/channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}} catch (Exception e) {e.printStackTrace();}}
    }
    
  • 消费者
    /*** 服务端,接收信息*/
    public class Consumer {//指定接收队列名称private final static String QUEUE_NAME = "hello";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();//设置目标主机ipfactory.setHost("192.168.47.128");//设置用户密码factory.setUsername("yf");factory.setPassword("123456");//建立连接Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = new DeliverCallback() {@Overridepublic void handle(String consumerTag, Delivery message) throws IOException {String msg = new String(message.getBody(), "UTF-8");System.out.println(" [x] Received '" + msg + "'");}};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}
    }
    

二、工作队列模式

简介

  • 工作队列与简单模式相比,一个生产者、多个消费者(排它关系),多个消费端共同消费同一个队列中的消息
  • 使用场景:对于消息生产速度大于消费速度场景,可以增加消费者减少单个消费者压力

代码示例

  • 生产者
    public class Producer {//队列名称private final static String QUEUE_NAME = "work_queues";public static void main(String[] args) {//建立连接工厂ConnectionFactory factory = new ConnectionFactory();//设置目标主机ipfactory.setHost("192.168.47.128");//设置账号名密码factory.setUsername("yf");factory.setPassword("123456");
    //        修改端口的设置
    //        factory.setPort();try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {//通道和队列的连接/*queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments)参数说明:queue:队列名称durable:是否持久化exclusive:是否独占,是否一个消费者监听一个队列autoDelete:是否自动删除。如果没有消费者consumer,自动删除掉队列arguments:参数*/
    //            channel.basicQos(1);// 如果你的消息还没有确认,那么我同一时间只能给你发送一条消息channel.queueDeclare(QUEUE_NAME, false, false, false, null);for (int i = 0; i < 10; i++) {//需要发送的消息String message = "Hello RabbitMQ!"+i;//通过最基础的发布/*basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)参数说明:exchange:指定交换机,如果使用默认模式,就使用“”routingKey:路由名称props:配置信息body:发送的消息(要求字节数组)*/channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}} catch (Exception e) {e.printStackTrace();}}
    }
    
  • 消费者
    /*** 服务端,接收信息*/
    public class Consumer1 {//指定接收队列名称private final static String QUEUE_NAME = "work_queues";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();//设置目标主机ipfactory.setHost("192.168.47.128");//设置用户密码factory.setUsername("yf");factory.setPassword("123456");//建立连接Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.basicQos(1); // 如果你的消息还没有确认,那么我同一时间只能给你发送一条消息channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = new DeliverCallback() {@Overridepublic void handle(String consumerTag, Delivery message) throws IOException {String msg = new String(message.getBody(), "UTF-8");System.out.println(" [x] Received '" + msg + "'");}};/* 这种写法和上面是一样的 使用的是lambda表达式DeliverCallback deliverCallback = (consumerTag, message) -> {String msg = new String(message.getBody(), "UTF-8");System.out.println(" [x] Received '" + msg + "'");};*/channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}
    }
    

小结

  • 分发机制:轮询分发机制
    • 也就是说当生产者生产了10条消息,2个消费者分别消费5条消息。
  • 应用场景:同一条消息,在多个消费者之间只能有一个消费,应用于只需要单节点消费的场景
    • 发送验证码
    • 发送生日提醒

三、发布订阅模式(Publish/Subscribe)

简介

  • 在订阅模型中,多了一个Exchange 角色:
  • Exchange:交换机(X)。接收生产者发送的消息; 处理投递消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。具体操作根据交换机类型来定义:
    • Fanout:广播,将消息交给所有绑定到交换机的队列
    • Direct:定向,把消息交给符合指定routing key 的队列
    • Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

代码示例

  • 生产者

  • 消费者


该文章还没写完,先发布出来,后面会持续更新!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】文件查看命令(六)

文章目录 wc 命令grep命令&#xff08;常用&#xff09;more 命令cat 命令less 命令&#xff08;不常用&#xff09;head 命令&#xff08;不常用&#xff09;tail 命令&#xff08;不常用&#xff09; wc 命令 功能描述: wc 命令用于统计文件中的字节数、字数、行数等信息。 …

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

第十一章:位运算符与位运算

文章目录 第十一章&#xff1a;位运算符与位运算1.按位与运算&#xff1a;&2.按位或运算&#xff1a;|3.按位异或运算&#xff1a;^4.取反运算符&#xff1a;~5.左移运算符&#xff1a;<<6.右移运算符&#xff1a;>>总结 第十一章&#xff1a;位运算符与位运算…

免费SSL证书和付费SSL证书的区别点

背景&#xff1a; 在了解免费SSL证书和付费SSL证书的区别之前&#xff0c;先带大家了解一下SSL证书的概念和作用。 SSL证书的概念&#xff1a; SSL证书就是基于http超文本传输协议的延伸&#xff0c;在http访问的基础上增加了一个文本传输加密的协议&#xff0c;由于http是明…

二分练习题——妮妮的月饼工厂

妮妮的月饼工厂 题目分析 这里出现了“最高高度”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 希望月饼的高度最大&#xff0c;而月饼的高度要满足一个条件&#xff0c;就是按照该高度切出来的月饼的块数应该大于等于K块。那么现在就是满足条件的最大值&…

【爬虫基础】第6讲 opener的使用

在爬虫中&#xff0c;opener是一个用来发送HTTP请求的对象。它可以用来模拟浏览器发送请求&#xff0c;包括设置请求头、处理Cookie等操作。使用opener可以实现一些高级功能&#xff0c;如模拟登录、处理验证码等。 方法1&#xff1a; from urllib.request import Request,bu…

ARMday7作业

实现三个按键的中断&#xff0c;现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…

扩展wordpress回收站功能

1、自定义WordPress回收站删除时间 WordPress回收站里的内容&#xff0c;默认会在30天之后删除&#xff0c;逻辑非常简单&#xff0c;否则WordPress回收站会越来越臃肿。当然&#xff0c;如果你觉得30天太长&#xff0c;我们也可以自定义内容存放的时间&#xff0c;我们需要把…

StableDiffusion Web UI开启FP8,极大节约显存

升级了Pytorch后&#xff0c;StableDiffusion最新版本就可以有使用FP8的基础了&#xff0c;因此把秋叶的LINUX包也升级到了最新的版本。 升级Pytorch参考我的升级记录&#xff1a; ComfyUI SDWebUI升级pytorch随记-CSDN博客 然后下一步就是如何开启FP8了。与ComfyUI不同&…

Spring boot2.X 配置https

背景 最近项目组说要将 http 升级成 https 访问&#xff0c;证书也给到我们这边了&#xff0c;当然我们这边用的是个二级域名&#xff0c;采用的是通配符访问的方式&#xff0c;比如一级域名是这样&#xff08;com.chinaunicom.cn&#xff09;&#xff0c;我们的则是&#xff0…

【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案

政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议&#xff0c;决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调&#xff1a;向科技要战斗力&#xff0c;加快推进“智慧消防”建设不断提升火灾防控…

区块链食品溯源案例实现(二)

引言 随着前端界面的完成&#xff0c;我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求&#xff0c;调用智能合约的方法获取食品溯源信息&#xff0c;并将结果返回给前端。 通过前后端的整合&#xff0c;我们可以构建一个食品溯源系统&#xf…

ArrayList和LinkedList有什么区别?

ArrayList和LinkedList的区别 ArrayList 和 LinkedList 是 Java 中常用的两种集合类&#xff0c;它们都实现了 List 接口&#xff0c;但在内部实现和性能上有一些区别。 内部实现&#xff1a; ArrayList 使用数组实现&#xff0c;它的元素在内存中是连续存储的&#xff0c;每…

lua 获取指定路径下的所有文件夹

一、io.popen 函数获取 io.popen 是 Lua 中的一个函数&#xff0c;它允许你执行一个外部命令并将命令的输出作为流处理。如果你想在 Lua 中通过 io.popen 执行 dir 命令(linux 命令是ls )来获取指定文件夹下的所有文件及其路径&#xff0c;你可以构造一个适用于 Windows 环境下…

【C语言】linux内核pci_iomap

一、pci_iomap /** pci_iomap 是一个用于映射 PCI 设备的 BAR&#xff08;Base Address Register&#xff0c;基地址寄存器&#xff09;的函数。* 此函数返回指向内存映射 IO 的指针&#xff0c;用于直接访问 PCI 设备的内存或 I/O 空间。* * 参数:* dev - 指向pci_dev结构的指…

【微服务篇】深入理解资源隔离,限流,熔断原理(Hystrix、Resilience4j和Sentinel)

限流、降级和资源隔离是分布式系统设计中常用的三种技术手段&#xff0c;它们主要目的是增强系统的稳定性和可用性&#xff0c;尤其在高并发和不稳定网络环境下显得尤为重要 1.资源隔离的实现方式 资源隔离通常有两种主要的实现方式&#xff1a;线程池隔离和信号量隔离。 线…

JDK8的下载安装与环境变量配置教程

前言 官网下载&#xff1a;Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧&#xff0c;直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…

servlet开发详解

一、什么是servlet&#xff0c;干什么用的&#xff1f;&#xff1f;&#xff1f; tomcat作为一个web服务器&#xff0c;也称作servlet容器。servlet只有放在web服务器中才能运行&#xff0c;不能独立运行。tomcat这个容器要做三件事&#xff1a;接收请求、处理请求和响应请求。…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述&#xff1a; 在我尝试运行 test_deal_file.py 时&#xff0c;我遇到了一个 ModuleNotFoundError 错误&#xff0c;Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题&#xff0c;我尝试了几种方法…

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…