RabbitMQ学习之旅(一)

RabbitMQ学习总结(一)

RabbitMQ简介

RabbitMQ是一个消息代理,其接收并转发消息。类似于现实生活中的邮局:你把信件投入邮箱的过程,相当于往队列中添加信息,因为所有邮箱中的信件最终都会汇集到邮局中;当邮递员把你的新建发送给收件人的时候,相当于消息的转发。

RabbitMQ中的常见术语

  • 生产者(Provider):生产者负责生产消息,并将其发送到消息队列中
  • 队列(Queue):消息代理(Proxy)角色,从生产者那里接收消息,并将其转发到消费者进行消费。队列主要受限于主机的内存和磁盘的大小,其本质是一个消息缓冲区
  • 消费者(Consumer):消费者从队列中接收消息,并对消息进行处理
  • 交换机(Exchange):交换机位于生产者(Provider)和队列(Queue)之间,相当于路由(Routing),服务器会根据路由键(RoutingKey)将消息经由交换机路由到对应的队列(Queue)上去
  • 信道(Channel):信道是生产者与消费者和队列进行通信的渠道,其是建立在TCP连接上的虚拟连接;RabbitMQ在一条TCP连接上建立成千上百条信道来达到多线程处理,这个TCP被多个线程共享,每个线程对应一个信道,每个信道对应唯一的ID,保障信道私有性

RabbitMQ简单使用

STEP1:准备`Maven`依赖

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

STEP2:生产者

public class Provider {    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {        // 创建连接        ConnectionFactory factory = new ConnectionFactory();        // 设置 RabbitMQ 的主机名        factory.setHost("ip");        factory.setPort(5672);        factory.setUsername("username");        factory.setPassword("password");        // 创建一个连接        Connection connection = factory.newConnection();        // 创建一个信道        Channel channel = connection.createChannel();            // 指定一个队列        // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)        // 参数1 queue :队列名        // 参数2 durable :是否持久化        // 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除        // 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列        // 参数5 arguments        channel.queueDeclare(QUEUE_NAME, false, false, false, null);        // 发送消息        String message = "Hello World!";        // basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)        // 参数1 exchange :交换器        // 参数2 routingKey : 路由键        // 参数3 props : 消息的其他参数        // 参数4 body : 消息体        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());        System.out.println(" [x] Sent ‘" + message + "‘");        // 关闭频道和连接          channel.close();        connection.close();    }}

注意:声明队列是幂等的,代表着只有在队列不存在的时候才会被创建,多次声明并不会重复创建。

STEP3:消费者

public class Recv {    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {        // 创建连接        ConnectionFactory factory = new ConnectionFactory();        // 设置 RabbitMQ 的主机名        factory.setHost("ip");        factory.setPort(5672);        factory.setUsername("username");        factory.setPassword("password");        // 创建一个连接        Connection connection = factory.newConnection();        // 创建一个通道        Channel channel = connection.createChannel();        // 指定一个队列        // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)        // 参数1 queue :队列名        // 参数2 durable :是否持久化        // 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除        // 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列        // 参数5 arguments        channel.queueDeclare(QUEUE_NAME, false, false, false, null);        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");        // 创建队列消费者,此处是一个回调函数,当消费者接收到来自消息队列的消息时,会调用该接口中被重写的方法        Consumer consumer = new DefaultConsumer(channel) {            @Override            public void handleDelivery(String consumerTag, Envelope envelope,                                       AMQP.BasicProperties properties, byte[] body) throws IOException {                String message = new String(body, "UTF-8");                System.out.println(" [x] Received ‘" + message + "‘");            }        };        // basicConsume(String queue, boolean autoAck, Consumer callback)        // 参数1 queue :队列名        // 参数2 autoAck : 是否自动ACK;为true的时候表示自动回复,为false的时候表示手动回复;自动回复的含义是,当消费        // 者接收到消息的时候,就自动认定该消息已经被消费;手动回复的含义是,不进行自动回复,只有接收到方法发送到的确认信        // 息,才确认该消息已经被消费        // 参数3 callback : 消费者对象的一个接口,用来配置回调        channel.basicConsume(QUEUE_NAME, true, consumer);    }}

原文地址:https://www.cnblogs.com/lurker-yaojiang/p/9912396.html

时间: 2024-10-07 10:55:46

RabbitMQ学习之旅(一)的相关文章

我的RabbitMQ学习之旅3 (发布/订阅)

在前面的教程中,我们创建了一个工作队列.工作队列背后的假设是,每个任务只被传递给一个工作人员.在这一部分,我们将做一些完全不同的事情 - 我们会向多个消费者传递信息.这种模式被称为“发布/订阅”. 本质上,发布的日志消息将被广播给所有的接收者 生产者 是发送消息的用户的应用程序. 队列 是存储消息的缓冲器. 消费者 是接收消息的用户的应用程序. RabbitMQ中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列中.实际上,生产者通常甚至不知道一个消息是否会被传送到任何队列中. 相反

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

SSIS 学习之旅 序章 和 简介

SSIS 学习之旅目录: 第一章: SSIS 学习之旅 第一个SSIS 示例(一) 第二章: SSIS 学习之旅 第一个SSIS 示例(二) 第三章: SSIS 学习之旅 数据同步 第四章: SSIS 学习之旅 FTP文件传输-FTP任务 第五章: SSIS 学习之旅 FTP文件传输-脚本任务 第六章: SSIS 学习之旅 FTP访问类 SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案,是Microsoft BI 解

【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

Git命令学习之旅——日志和穿梭版本号

在总结了git命令的基础之后,接下来我们看一下基础的一些进阶内容:删除撤销命令.日志查看命令等 既然有加入文件的功能,那么相相应的肯定有移除文件的功能,命令例如以下:git rm [文件名称] 在输入命令之后,例如以下图所看到的: 提示已经删除了"c.txt"文件.这个时候再用git status查看一下状态,例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JB

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1

菜鸟的Android学习之旅(一)

最近在拜读郭霖老师的经典<第一行代码>,作为一名菜鸟级的新手来说这本书确实对新手很友好,讲的很详细.如果你也像我一样作为一只小菜鸟想学习Android,还不了解这本书的,还没有想好入手哪一本书作为自己新手启蒙书的同学,个人觉得你就不要徘徊了,加入购物车吧! 因为我才是刚开始学习不久,第二章才学习了很少一部分,所以我没办法说点有营养的东西,我就先记录一下我学习过程中经历的错误吧. 第二章开始,郭老师教我们如何手动创建活动.边看书边敲代码,但是你会发现当你完全按照书上所说敲完所有需要的代码之后代码

iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题

问题描述 编写以下代码获取网络某个资源的MIMEType 1 -(void)getMIMEType 2 { 3 //路径 4 NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/img/bd_logo1.png"]; 5 //请求对象 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 NSOperationQueue *

c++ hmtlcxx 学习之旅

最近刚网页抓取,抓取下来后需要解析,所以在网上找了一些资料,也问问我的师兄,最终结合网上的开源知识,完成了htmlcxx的使用. vs2013. 首先要去下载htmlcxx: https://github.com/dhoerl/htmlcxx 或者你也可以百度下去下载一个. 接下来,将文件文件解压,我用vs2013将htmlcxx.vcproj打开,点击生成. 生成好就可以,点击调试会有错误,我们也不需要调试. 创建一个win32控制台,直接点击完成. 接下来将debug下的htmlcxx.li