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);
    }
}

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

  1. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  2. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  3. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  4. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  5. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  6. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  7. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  8. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  9. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

随机推荐

  1. [Python]基础教程(3)、Python基础语法

    Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...

  2. Codeforces 1045B Space Isaac - 数论 - Hash

    题目传送门 传送门I 传送门II 传送门III 题目大意 给定将$\left \{ 0, 1, \dots, m - 1\right \}$分成了不相交的两个非空集合$A$和$B$,给定$A$,问存在 ...

  3. ubuntu16.04安装wordpress

    ubuntu16.04安装wordpress和centos7安装wordpress存在一定的差异. 当然共性大于差异. 共性是lamp环境. wordpress的必备环境. 先共性再差异. 一.搭建l ...

  4. 复旦高等代数 II(17级)每周一题

    本学期将继续进行高等代数每周一题的活动.计划从第一教学周开始,到第十六教学周为止(根据法定节假日安排,中间个别周会适当地停止),每周的周末将公布1道思考题(共16道),供大家思考和解答.每周一题通过“ ...

  5. luogu3426 [POI2005]SZA-Template 后缀树

    链接 bzoj不能auto https://www.luogu.org/problemnew/show/P3426 思路 这个要求的串一定是S的前缀和S的后缀. 转化一下 建立出来fail树(fail ...

  6. MySQL5.5安装教程

                                          登录MySQL:mysql -uroot -p密码 退出MySQL:exit | quit 查看数据库:show datab ...

  7. 20175317 《Java程序设计》第四周学习总结

    20175317 <Java程序设计>第四周学习总结 教材学习内容总结 第四周我学习了教材第五章的内容,了解了子类与继承的知识,学到了以下内容: 明白了什么是子类与父类.类的树形结构. 子 ...

  8. ONOS架构-系统组件

    系统组件 系统分层 App/core/providers 业务和子系统 一个业务service是有多个组件构成的功能单元,基于各层软件栈提供一个垂直的分片slice,将构成业务service的组件集合 ...

  9. canvas实现点连线动画

    给定一系列坐标(x, y)点, 实现将各个点按照先后顺序连接起来的动画.还有两个要求: 1.点与点之间直接用线段连接, 不用考虑曲线 2.动画支持暂停, 继续, 重头开始播放功能 这个功能该怎么实现呢 ...

  10. 安装tifffile

    python的opencv和PIL不能很好地处理tiff图像,所以我就转用tifffile 但是tifffile也装了很近,因为我是远控别人的电脑,所以看不太清报错,就自己瞎猜,不过还是装好了 首先去 ...