相关文章

RabbitMQ系列汇总:RabbitMQ系列


前言

  • 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。

  • 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。

  • 在后台运行的工作进 程将弹出任务并最终执行作业。

  • 当有多个工作线程时,这些工作线程将一起处理这些任务。

  • 作为一名将来的高级程序员,我们先将之前的简单队列模式来进行一定的优化。

    • 这是我们的生产者和消费者,显而易见,大量的重复代码。
  • 优化

    • 先将队列名抽取出来
    • public class QueueNameConstant {
      ​//简单队列模式public static final String JIANDAN_MODEL = "dayu";
      ​//工作队列模式public static final String WORK_MODEL = "work_model";
      }
      
    • 抽取连接工厂、建立连接、建立通道
    • /*** 公用部分创建工具类*@author DingYongJun*@date 2021/8/1*/
      public class RabbitMqUtils {//得到一个连接的 channelpublic static Channel getChannel() throws Exception {//创建一个连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("ip地址");factory.setUsername("admin");factory.setPassword("111111");Connection connection = factory.newConnection();Channel channel = connection.createChannel();return channel;}
      }
      
    • 大致结构这样
  • nice!然后想怎么用就怎么用吧!

一、生产者

  • /*** 这是一个测试的生产者*@author DingYongJun*@date 2021/8/1*/
    public class DyProducerTest_02 {/*** 这里为了方便,我们使用main函数来测试* 纯属看你个人选择* @param args*/public static void main(String[] args) throws Exception{//使用工具类来创建通道Channel channel = RabbitMqUtils.getChannel();
    ​/*** 生成一个队列* 1.队列名称* 2.队列里面的消息是否持久化 默认消息存储在内存中* 3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费* 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除* 5.其他参数*/channel.queueDeclare(QueueNameConstant.WORK_MODEL,false,false,false,null);
    ​
    ​/*** 发送一个消息* 1.发送到那个交换机* 2.路由的 key 是哪个* 3.其他的参数信息* 4.发送消息的消息体*/for (int i=0;i<6;i++){String message="我是生产者,我告诉你一个好消息!"+i;Thread.sleep( 1000 );channel.basicPublish("",QueueNameConstant.WORK_MODEL,null,message.getBytes());System.out.println("消息发送完毕");}}
    ​
    }
    

二、消费者

  • 为了测试轮训分发消息,这里我们建两个消费者进行消费消息。

  • 消费者A

  • /*** 这是一个测试的消费者*@author DingYongJun*@date 2021/8/1*/
    public class DyConsumerTest_02 {
    ​public static void main(String[] args) throws Exception{//使用工具类来创建通道Channel channel = RabbitMqUtils.getChannel();
    ​System.out.println("我是消费者A,我在等待接收消息!");DeliverCallback deliverCallback = (String var1, Delivery var2)->{String message= new String(var2.getBody());System.out.println(message);};CancelCallback cancelCallback = (String var1)->{System.out.println("消息消费被中断");};
    ​/*** 消费者消费消息* 1.消费哪个队列* 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答* 3.消费者未成功消费的回调*/Thread.sleep(1000);channel.basicConsume(QueueNameConstant.WORK_MODEL,true,deliverCallback,cancelCallback);}
    }
    
  • 消费者B代码一致,不再粘贴出来占用篇幅!

  • 将消费者A、B都启动起来

  • 启动生产者,发送六条消息

  • 消费者A

  • 消费者B

  • 结果很明显,你一条,我一条,大家非常有顺序的一人一条!没有发生混乱抢劫啥的。哈哈哈

三、总结

  • 轮询分发就是将消息队列中的消息,依次发送给所有消费者。一个消息只能被一个消费者获取。

  • 特点

    • 一条消息只会被一个消费端接收。
    • 队列采用轮询的方式将消息是平均发送给消费者的。
    • 消费者在处理完某条消息后,才会收到下一条消息。
  • 生产端

    • 声明队列
    • 创建连接
    • 创建通道
    • 通道声明队列
    • 制定消息
  • 消费端

    • 声明队列
    • 创建连接
    • 创建通道
    • 通道声明队列
    • 重写消息消费方法
    • 执行消息方法

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

工作队列模式(任务队列)| RabbitMQ系列(二)相关推荐

  1. RabbitMq系列(九):主题交换Topic Exchange

    系列文章 RabbitMq系列(一):服务器搭建 RabbitMq系列(二):最简单的例子 RabbitMq系列(三):工作队列 RabbitMq系列(四):消息确认和持久性 RabbitMq系列(五 ...

  2. RabbitMQ系列教程之二:工作队列(Work Queues)

    今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示) 在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序.在本教程中,我们将创建一个 ...

  3. 【外行也能看懂的RabbitMQ系列(二)】—— RabbitMQ的Web管理界面(rabbitmq_management)详解(内含Topic模式通配符实操)

    系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...

  4. 【RabbitMQ】基础二:工作队列模式(Work queues)

    [RabbitMQ]基础二:工作队列模式(Work queues) 1. 模式说明 2. 示例代码 2.1 生产者 2.2 消费者 2.3 测试 3. 小结 1. 模式说明 Work Queues 与 ...

  5. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

  6. RabbitMQ系列笔记主题订阅模式

    导语 昨天的内容主要讲了RabbitMQ的发布订阅模式和路由模式,都很好的满足了我们的日志打印,但是如果说,我对日志的打印,希望可以过滤掉一些内容呢,比如说,在打印错误日志的时候,只打印login时的 ...

  7. RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)

    在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个[消费者]传递信息.这种模式被称为"发布/订阅 ...

  8. RabbitMQ(二):Work Queues、循环分发、消息确认、持久化、公平分发

    内容翻译自:RabbitMQ Tutorials Java版 RabbitMQ(一):Hello World程序 RabbitMQ(二):Work Queues.循环分发.消息确认.持久化.公平分发 ...

  9. RabbitMQ系列教程之四:路由(Routing)

    在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例如,我们可以只将关键的 ...

最新文章

  1. win8mysql安装教程zip_mysql 8.0.18.zip安装配置方法图文教程(windows 64位)
  2. 成功有感之给年轻人的10个忠告
  3. spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.
  4. python 享元模式_python 设计模式之享元(Flyweight)模式
  5. Python学习之Python安装
  6. 联想电脑计算机怎么设置十进制,如何在win10系统中设置电池充电阈值
  7. 〖Linux〗以后台方式启动/结束指定程序/命令(不受 exit 或点击窗口关闭按钮等终端退出操作的影响)...
  8. matlab的数值求解实验报告,偏微分方程数值及matlab实验报告
  9. windows10清理鼠标右键菜单
  10. 代码复杂度问题,coverity代码静态分析工具检查
  11. QCon-小布助手对话系统工程实践
  12. 最优化:拟牛顿法、最速下降法、共轭梯度法、信赖域法、协同优
  13. CSS 技巧,冲鸭!
  14. XV6 RISCV 源码阅读报告之 进程调度
  15. vue 表单验证正则_vue表单验证
  16. 普惠微光汇聚暖阳,招联携手奋斗者筑梦前行
  17. ppt怎么制作抖音快手快闪效果的倒计时动画?
  18. 思考模式:六顶思考帽(Six Thinking Hats)
  19. 利用Canvas绘制雷达图
  20. 学生公寓管理系统-python+Django+Mysql(附视图代码)

热门文章

  1. Transact使用
  2. 网络知识详解之:网络攻击与安全防护
  3. PHP的优势是什么?
  4. python制作壁纸获取器exe,壁纸采集
  5. JUC Striped64
  6. 指南-Luat二次开发教程指南-第一个Luat程序
  7. Vue数据格式化:JSON、HTML、XML数据的格式化显示
  8. 计算机光线太强哪里调整,电脑光线太强怎么调暗
  9. 水文专业对计算机要求,来了来了,高考志愿这么填!
  10. 手机的耳机插电脑上可以录音吗 怎么录音