最简单的案例:

https://gitee.com/n_zhe/rabbitmq-demo

通过简单的例子分析mq是怎样发送和拉取消息的:

 quickStart中的简单案例
    通过简单的案例来分析rabbitmq是怎样发送和拉取消息的
1、查看Procuder.java文件
package com.xsxy.rabbitmq.demo.quickStart;

import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.AMQP.BasicProperties; /**
* Procuder
*/
public class Procuder { public static void main(String[] args) throws IOException, TimeoutException {
// 1、创建链接工厂ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("*****");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("***");
connectionFactory.setPassword("***"); // 2、通过工厂创建connection
Connection connection = connectionFactory.newConnection(); // 3、通过connection创建一个Channel
Channel channel = connection.createChannel(); String exchange = "";
String routingKey = "test001";
BasicProperties props = null;
String msg = "hello rabbit-mq";
// 4、通过channel发送数据 发送5次数据
for (int i = 0; i < 5; i++) {
channel.basicPublish(exchange, routingKey, props, msg.getBytes());
} System.out.println("已经发送消息了");
// 5、记得要关闭相关的链接
channel.close();
connection.close();
} }
 
    从最开始的ConnectionFactory开始
        ①首先是常见了一个工厂
            进入ConnectionFactory中,可以明显的看到一些基本的参数,例如默认的用户,密码,vhost。。。
            该对象只有一个默认的无参构造,因此具体参数的初始化都在connectionFactory.newConnection()方法中
        ②进入newConnection()方法
public Connection newConnection() throws IOException, TimeoutException {
return newConnection(this.sharedExecutor, Collections.singletonList(new Address(getHost(), getPort())));
}

  最终调用:

  参数executor默认为null,addrs为mq的地址+端口,clientProvideName为null

  

  继续观察:

FrameHandlerFactory fhFactory = createFrameHandlerFactory();

  其实这个FrameHandlerFactory就是对SocketFactory进行了一次封装:

  

  

  最终返回的为SocketFrameHandler类,该类是对Socket进行了封装:

  

  继续向下走,会使用之前的返回的FrameHander对象new一个AMQConnection对象:

  

  然后会调用AMQConnection的start()方法:

  下边这个for循环,第一次启动后就直接return??

  

  ③返回AMQConnection对象

    通过Connectin来创建Channel,返回ChannelN对象

  ④通过ChannelN对象的basicPublish方法发布消息

    先通过exchange,routingKey等参数构建一个Publish,进而构建一个AMQCommand对象

  

  最终:

  

流程:

  消费端:

package com.xsxy.rabbitmq.demo.quickStart;

import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.ShutdownSignalException;
import com.rabbitmq.client.QueueingConsumer.Delivery; /**
* Consumer
*/
public class Consumer { public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException,
ConsumerCancelledException, InterruptedException {
// 1、创建链接工厂ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("****");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("***");
connectionFactory.setPassword("***"); // 1.1 以下两个配置代表是否自动重连) 防止因网络故障导致mq断开
connectionFactory.setAutomaticRecoveryEnabled(true);
connectionFactory.setNetworkRecoveryInterval(3000); // 2、通过工厂创建connection
Connection connection = connectionFactory.newConnection(); // 3、通过connection创建一个Channel
Channel channel = connection.createChannel(); // 4、声明一个队列
// queue 队列的名称 durable 是否持久化 exclusive 是否独占 autoDelete 是否自动删除 arguments
// 其他的一些参数设置
String queueName = "test001";
channel.queueDeclare(queueName, true, false, false, null); // 5、常见一个消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel); // 6、 设置channel
channel.basicConsume(queueName, true, queueingConsumer); System.out.println("等待获取消息======");
// 7、获取消息
while (true) {
Delivery delivery = queueingConsumer.nextDelivery();
String body = new String(delivery.getBody());
System.out.println("消费端" + body);
}
}
}

  开始也是获取ConnectionFactory、Connection、Channel,然后通过Channel来操作(不管是生产端还是消费端,mq都是通过channel来进行操作的)

  ①消费端会声明一个消费队列

 // 5、常见一个消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);

  

  ②通过Channel将消费这和消息队列关联

    队列消费者,用于监听队列中的消息。调用nextDelivery方法时,内部实现就是调用队列的take方法。该方法的作用:获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。说白了就是如果没有消息,就处于阻塞状态。

  运行结果:

  消费端:

等待获取消息======

  生产端:

已经发送消息了

当生产端发送消息之后,消费端输出:

等待获取消息======
消费端hello rabbit-mq
消费端hello rabbit-mq
消费端hello rabbit-mq
消费端hello rabbit-mq
消费端hello rabbit-mq

 

以上代码没有指定exchange,因此rabbitmq server会自动通过默认的exchange(即default exchange)取转发消息,如果生产者的routingkey和消费端的队列名称相同的话,则能够转发成功,否则失败

            

rabbitmq-5-案例1-简单的案例的更多相关文章

  1. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

  2. MyBatis学习总结(一)简单入门案例

    MyBatis学习总结(一)简单入门案例 主要内容:本文主要通过对数据库中的use表进行增删改查总结mybatis的环境搭建和基本入门使用 一.需要的jar包: 1.核心包 2.依赖包 3.jdbc数 ...

  3. 一个简单的案例带你入门Dubbo分布式框架

    相信有很多小伙伴都知道,dubbo是一个分布式.高性能.透明化的RPC服务框架,提供服务自动注册.自动发现等高效服务治理方案,dubbo的中文文档也是非常全的,中文文档可以参考这里dubbo.io.由 ...

  4. solr简单搜索案例

    solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...

  5. 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单

    结构思考力 名义上全书是讲结构化思考,实际内容是用结构化思考的方法来整理PPT的思路,让PPT的逻辑更清晰.少部分提到如何修改标题更吸引人,如何做图表设计. 书中结构化思考的基本思路,重要的有两个:1 ...

  6. springcloud+eureka简单入门案例

    springcloud+eureka简单入门案例 一.服务提供者 直接提供服务,入门案例没有特别要设置的地方,注意下端口,由于要启动多个服务,可能会冲突 配置文件(src/main/resources ...

  7. Python 简单爬虫案例

    Python 简单爬虫案例 import requests url = "https://www.sogou.com/web" # 封装参数 wd = input('enter a ...

  8. arduino中SCoop库的简单应用案例

    转载:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html arduino中SCoop库的简单应用案例首先这篇文章来在视频https://v ...

  9. ReentrantReadWriteLock读写锁简单原理案例证明

    ReentrantReadWriteLock存在原因? 我们知道List的实现类ArrayList,LinkedList都是非线程安全的,Vector类通过用synchronized修饰方法保证了Li ...

  10. redux 的简单实用案例

    redux 的简单实用案例 整体思想与结构 创建一个Action 创建一个Reducer 创建Store 在App组件开始使用 整体思想与结构 文件目录如下: 构建 action,通过创建一个函数,然 ...

随机推荐

  1. [转载]Linux上使用ssl进行端口转发

    原文地址:Linux上使用ssl进行端口转发 作者:呼延十 背景介绍 作为一个后端程序员,经常要和别人联调接口,每当这时,总是被公司的各种,dev,qa,pre,prod环境搞得头疼,,,我真的只是想 ...

  2. React(5) --绑定函数事件

    绑定函数事件 在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要将事件处理函数运行时的 this 指向当前组件实例. run(){     ...

  3. nginx下TP3.2访问页面总是404

    这是我测试onethink用的配置 可以参考一下 server { listen 80; server_name onethink.dev www.onethink.dev; root /vagran ...

  4. Minor GC与Full GC分别在什么时候发生?

    Minor GC 当Eden区没有足够空间进行分配时,虚拟机就会进行一次Minor GC 新生代的垃圾收集动作,采用的是复制算法 对于较大的对象,在Minor GC的时候可以直接进入老年代 Full ...

  5. MFC的Dlg和App什么区别?应用程序类与对话框类

    MFC里有个app类..他是一个项目工程类,有一个全局的实例化.theApp你可以理解为整个项目的实例,它重载了入口函数,所有的窗口神马的,都是在这个类里实例化的. dlg是对话框,是一个窗口.一个程 ...

  6. 【转】跨域资源共享 CORS 详解

    本文来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 阮一峰老师的网络日志 CORS是一个W3C标准,全称是"跨域资源共享"( ...

  7. vue项目中echarts使用渐变效果报错echarts is not defined

    解决办法:在当前单组件中在引用一次

  8. java使用开源类库Tesseract实现图片识别

    Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选. Tess4J则是Tesseract在Java PC上的应用 Tesseract的OCR引擎最先由HP实验 ...

  9. zenoss(智能监控软件)

    Zenoss Core是开源企业级IT管理软件-是智能监控软件,他允许IT管理员依靠单一的WEB控制台来监控网络架构的状态和健康度,同时也是开源的网络与系统管理软件.全名          Zenos ...

  10. [CSP-S模拟测试]:次芝麻(数学)

    题目描述 小$K$和小$X$都是小次货.身为小次货,最重要的事情就是次啦!所以他们正在纠结如何分芝麻次.一开始,小$K$有$n$个芝麻,小$X$有$m$个芝麻.因为他们都想次更多芝麻,所以每次手中芝麻 ...