// 连接RabbitMQ 简单工具类

public static Connection getConnection() throws Exception {
        //1. 定义一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2. 获取服务地址
        factory.setHost("127.0.0.1");
        //3. AMQP 5672
        factory.setPort(5672);
        //4. vhost
        factory.setVirtualHost("/test");
        //5. 用户名
        factory.setUsername("test");
        //6. 密码
        factory.setPassword("test");
        return factory.newConnection();
    }

// 获取连接,生成通道

Connection connection = ConnectionUtils.getConnection();

Channel channel = connection.createChannel();

1)simple - 简单队列

涉及3个对象: 生产者  队列 RabbitMQ  消费者

生产者:

// 申明队列

channel.queueDeclare(QUEUE_NAME,false,false,false,null);

// 推送信息

channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());

消费者:

// 申明队列

channel.queueDeclare(QUEUE_NAME,false,false,false,null);
 
     DefaultConsumer consumer = new DefaultConsumer(channel) {
            //获取到达的消息
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body, "utf-8");

// 消费消息
                System.out.println("new api recv: " + msg);
            }
        };
 
        //4. 监听队列
        channel.basicConsume(QUEUE_NAME,true,consumer);

缺点:耦合性高,生产者一 一对应消费者。

2)work queues - 工作队列

channel.basicQos(1); //保证每次只分发一个

boolean autoAck = true;

channel.basicConsume(QUEUE_NAME,autoAck,consumer);

autoAck true 代表自动应答,

false代表需要如下手动应答:

channel.basicAck(envelope.getDeliveryTag(),false);

轮询分发:自动应答,任务消息总是均匀分配

公平分发:手动应答,能者多劳

3)消息持久化

Boolean durable = true;// 持久化,注意在已存在的队列上修改是不行的,可以删除原有队列或重新生成队列。

channel.queueDeclare(QUEUE_NAME,durable ,false,false,null);

4)订阅模式 publish/subscribe

  • 一个生产者,多个消费者
  • 每一个消费者都有自己的队列
  • 生产者没有直接把消息发送到队列 而是发送到了交换机 转发器(exchange)
  • 每个队列都要绑定到交换机上,
  • 生产者发送的消息 经过交换机 达到队列 就能实现一个消息被多个消费者消费

生产者:

channel.exchangeDeclare(EXCHANGE_NAME,"fanout"); // 声明交换机,"fanout"为分发

消费者:

channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"");//绑定队列到交换机转发器

5)Exchange(交换机 转发器)

一方面是接收生产者的消息,另一方面是向队列推送消息。

匿名转发 ""

fanout(不处理路由键)

direct (处理路由器)

6)路由模式

生产者:

channel.exchangeDeclare(EXCHANGE_NAME,"direct"); // 声明交换机

String routingKey = "info"; // error、warn..  绑定路由

channel.basicPublish(EXCHANGE_NAME,routingKey ,null,msg.getBytes());

消费者:

channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"info");// 消费者绑定到路由

7)事务机制

txSelect  txCommit  txRollback

txSelect:用户将当前 channel 设置成 transaction 模式

txCommit  :用于提交事务;

txRollback:回滚事务。

这种模式很耗时,采用这种方式,降低了 RabbitMQ 的消息吞吐量

8)Conform 模式

生产者端 conform 模式的实现原理:

生产者将信道设置成 conform 模式,一旦信道进入 conform 模式,所有在该信道上面发布的消息都会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker 就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经到达目的队列了,如果消息和队列是持久化的,那么确认消息会将消息写入磁盘之后发出,broker 也可以设置 basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理。

Conform 模式最大的好处就是他是异步。

开启 conform 模式    Channel.conformSelect()

编程模式:

①普通 发一条 waitForConfirms()

②批量的 发一批 channel.waitForConfirmsOrDie(); //直到所有信息都发布,只要有一个未确认就会IOException

③异步 conform 模式:提供一个 回调方法

异步模式:

channel 对象提供的 ConfirmListener() 回调方法只包含 deliveryTag (当前 channel 发出的消息序列),我们需要自己为每一个 Channel 维护一个 unconfirm 的消息序号集合,每 publish 一条数据,集合中元素加 1 ,每回调一次 handleAck 方法,unconfirm 集合删掉相应的一条(multiple = false)或多条(multiple = true)记录。从程序运行效率上看,这个 unconfirm 集合最好采用有序集合 SortedSed 存储结构。

例如:

SortedSet<Long> confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());
channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
       public void handleAck(long deliveryTag, boolean multiple) throws IOException {
            if (multiple) {
                  confirmSet.headSet(deliveryTag + 1L).clear();
              } else {
                    confirmSet.remove(deliveryTag);
              }
       }
       public void handleNack(long deliveryTag, boolean multiple) throws IOException {
             if (multiple) {
                 confirmSet.headSet(deliveryTag + 1L).clear();
              } else {
                  confirmSet.remove(deliveryTag);
              }
        }
});

RabbitMQ自学入门相关推荐

  1. RabbitMQ(一):RabbitMQ快速入门

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括Rab ...

  2. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

  3. rabbitmq详细入门文档+springboot结合使用

    在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景: 商品的原始数据保存在数据库中,增删改查都在数据库中完成. 搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化 ...

  4. RabbitMQ的入门程序test测试代码

    RabbitMQ有以下几种工作模式 : 1.Work queues  工作队列 2.Publish/Subscribe 发布订阅 3.Routing      路由 4.Topics        通 ...

  5. python自学行吗-自学入门Python能学会吗?

    原标题:自学入门Python能学会吗? 学习 Python,几行代码就可以实现一个爬虫,几个函数就可以做简单的数据分析,写一个小工具.小游戏也是分分钟的事情--这种成就感,会激发你最原始的兴趣.因此就 ...

  6. python能自学成功吗-自学入门Python能学会吗?

    原标题:自学入门Python能学会吗? 学习 Python,几行代码就可以实现一个爬虫,几个函数就可以做简单的数据分析,写一个小工具.小游戏也是分分钟的事情--这种成就感,会激发你最原始的兴趣.因此就 ...

  7. 543、RabbitMQ详细入门教程系列 -【Confirm与Mandatory】 2022.09.05

    目录 一.前言概述 二.SpringAMQP配置Confirm 2.1 Connection设置 2.2 template设置 2.3 Confirm实现 三.SpringAMQP配置ManDator ...

  8. 【外行也能看懂的RabbitMQ系列(一)】—— RabbitMQ快速入门篇(内含丰富实例)

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

  9. Photoshop完全自学入门与经典实例全视频教程

    基本信息 讲师: 李辉 时长:43分钟 集数:20 每集定价:2 元 视频内容: 本套PS视频教程共20讲,分为基础篇和实例篇,各10讲. 基础篇重点介绍了学习Photoshop软件时涉及的有关入门知 ...

最新文章

  1. VS2010 代码前出现虚线的问题
  2. 制图折断线_甲级设计院CAD制图技巧与画法讲解! 超实用,值得你收藏~
  3. Linux技术网站中文,Linux技术网站,putty工具,中文显示设置
  4. 阿里云前端周刊 - 第 33 期
  5. php(2)—基础补充
  6. mysql doen s exist_Mysql中大小写敏感问题导致的MySql Error 1146 Tabel doen’t exist错误
  7. HTTP 遭 Google 抛弃,开发者该如何应对?
  8. 苏宁大数据怎么运营_苏宁易购的经营模式
  9. Ubuntu 18安装谷歌浏览器
  10. Excel导入SQL数据库出现的问题
  11. 130242014057 周陈清 实验一
  12. (栈)栈 给定push序列,判断给定序列是否是pop序列
  13. linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
  14. CentOS安装SVN
  15. 从头开始聊P问题、NP问题与NPC问题
  16. [笔记分享] [Camera] msm8x25 camera hal 流程记录
  17. C#WinForm实现雷速网站比赛MQTT逆向采集
  18. 如何将PPT压缩后保存
  19. 跟着Vam一起学习Typescript(第一期)(更新中)
  20. ctf镜子里面的世界_萌娃照镜子,演绎小脑袋大疑惑,“虚晃一枪”的模样简直萌化了...

热门文章

  1. Python 遗传算法求解Stackelberg均衡问题(带概率约束)
  2. 飞康应用——虚拟磁盘和创建SAN资源
  3. 生信学习——生信人的20个R语言习题(上)(附详细答案解读)
  4. WampServer环境的搭建
  5. Java利用EasyPoi实现excel文件导入和导出
  6. Windows记事本UTF-8编码异常
  7. Spatially and Temporally Efficient Non-local Attention Net work for Video-based Re-Id 论文笔记
  8. Rotary Knob Slider
  9. python博弈树实现AI五子棋小游戏
  10. 趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合