一、起航

本章节,柯南君将从几个层面,用官网例子讲解一下RabbitMQ的实操经典程序案例,让大家重新回到经典“Hello world!”(The simplest thing that does something )时代,RabbitMQ 支持N多种客户端(client),这里无法一一讲解,暂定java client,有时间的情况下,在弥补一下。

事先,先普及一下图标(我们会在下面的事例中,会大量用到,所以先普及一下,便于识别,最终更好理解事例的含义)

1、图标概念

① producting(生产者):在程序中 发送消息的一端,我们暂且称之为 生产者,在这里用“p”表示

② queue(队列):队列是一个邮箱的名字。它住在RabbitMQ。尽管消息流经RabbitMQ和您的应用程序,他们只可以存储在一个队列中。队列是不受任何限制,它可以储存尽可能多的信息(按你兴趣来了),它本质上是一个无限缓冲区。许多生产商可以发送消息到一个队列,许多消费者可以尝试接收数据从一个队列。

③ consuming(消费者):消费者和生产者是对应的,较为相似的意思;在这里,我用“C”表示

2、The Java client library

RabbitMQ 中AMQP这是一个开放的、通用的协议消息。有许多客户AMQP在许多不同的语言。我们将使用提供的Java客户机RabbitMQ。

我们需要下载(Download) client library package,并要核实每个jar包,解压到相应位置,如下图所示:

第一步:点击 http://www.rabbitmq.com/java-client.html,然后找到相应的lib下载位置

第二步:选择合适的下载,比如我下载了zip包,如图所示:

第三步:Unzip it(解压它) 到你的working directory(工作目录)中 and grab (并且获得)你的jar包文件

  • $ unzip rabbitmq-java-client-bin-*.zip
  • $ cp rabbitmq-java-client-bin-*/*.jar ./

二、程序案例

1) "Hello World"

在这部分教程中我们将用Java写两个程序,发送一个消息的生产者,消费者接收信息并打印出来。我们会掩盖一些细节的Java API,集中在这个非常简单的东西开始。这是一个“Hello World”的消息。在下面的图中,“P”是我们的生产和“C”是我们的消费者。中间的框是一个队列,消息缓冲区RabbitMQ保持代表消费者。
 ① sending (发送)

首先 让The sender(消息发送者)发送消息并且让我们的receiver (消息接收者)接收消息,The sender(消息发送者)将会connect to(连接)RabbitMQ,发送一个single message(单一的信息),然后exit(退出)。
  • 在send.java 中,我们需要import一些class ,如下所示:
	import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
  • set up(设置)类和queue的name
	public class Send {

 		 private final static String QUEUE_NAME = "hello";

  		public static void main(String[] argv)
throws java.io.IOException {
...
}
}
  • then 我们create 一个connection (连接)到server(服务端)
    onnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
备注
  • 这个connection 是抽象的socket connection链接;
  • 负责协议版本(protocol version negotigation)和身份认证(authentication );
  • 我们在本地机器上连接到一个代理即 localhost ,如果我们想要连接到代理不同机器上我们简单的指定其名称或者IP地址即可;
  接下来,我们创建一个channel(通道),这个通道汇集了大多数的API服务!
为了发送,我们必须先声明一个为我们发送queue(队列),然后,往queue里发送一个message
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
消息内容是一个字节数组,所以你可以编码任何你喜欢的。最后,我们关闭通道和连接;
    channel.close();
connection.close();
问题:
 如果 sending doesn‘t work! 我们将怎么办?why?
如果这是你第一次使用RabbitMQ并且你看不到“发送的”消息,那么你可能抓耳挠腮没有足够的空闲磁盘空间(默认情况下它需要至少1 gb免费),因此拒绝接受消息。检查代理日志文件确认,如果有必要减少限制。配置文件的文档将向您展示如何设置disk_free_limit。
接下来的是send.java所有源代码:
  1. import com.rabbitmq.client.ConnectionFactory;
  2. import com.rabbitmq.client.Connection;
  3. import com.rabbitmq.client.Channel;
  4. public class Send {
  5. private final static String QUEUE_NAME = "hello";
  6. public static void main(String[] argv) throws Exception {
  7. ConnectionFactory factory = new ConnectionFactory();
  8. factory.setHost("localhost");
  9. Connection connection = factory.newConnection();
  10. Channel channel = connection.createChannel();
  11. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  12. String message = "Hello World!";
  13. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  14. System.out.println(" [x] Sent '" + message + "'");
  15. channel.close();
  16. connection.close();
  17. }
  18. }


 ② Receiving (接收)
  这就是我们的发送者。我们的接收器是将消息从RabbitMQ,所以不像发送方发布一个消息,我们将保持运行监听消息并打印出来
  • The code (in Recv.java)
    has almost the same imports as Send:
	import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.QueueingConsumer;
额外的QueueingConsumer是一个类,我们将使用缓冲消息推到我们的服务器。设置发送者一样,我们打开一个连接和一个通道,并宣布我们将使用的队列。注意这与队列,发送发布。
public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv)
throws java.io.IOException,
java.lang.InterruptedException { ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
...
}
}
注意,我们在这里声明队列。因为我们可能会在发送方之前开始启动接收方,我们要确保队列存在之前我们尝试使用消息。我们要告诉服务器提供我们从队列的消息。因为它将异步消息,我们提供一个回调对象的形式,将缓冲的消息,直到我们准备使用它们。
QueueingConsumer要做什么呢?
  QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer); while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
}
QueueingConsumer.nextDelivery()块,直到另一个来自服务器的消息交付。  

下面是Recv.java 源代码:
  1. import com.rabbitmq.client.ConnectionFactory;
  2. import com.rabbitmq.client.Connection;
  3. import com.rabbitmq.client.Channel;
  4. import com.rabbitmq.client.QueueingConsumer;
  5. public class Recv {
  6. private final static String QUEUE_NAME = "hello";
  7. public static void main(String[] argv) throws Exception {
  8. ConnectionFactory factory = new ConnectionFactory();
  9. factory.setHost("localhost");
  10. Connection connection = factory.newConnection();
  11. Channel channel = connection.createChannel();
  12. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  13. System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
  14. QueueingConsumer consumer = new QueueingConsumer(channel);
  15. channel.basicConsume(QUEUE_NAME, true, consumer);
  16. while (true) {
  17. QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  18. String message = new String(delivery.getBody());
  19. System.out.println(" [x] Received '" + message + "'");
  20. }
  21. }
  22. }

RabbitMQ学习总结(3)——入门实例教程详解的更多相关文章

  1. 经典Spring入门基础教程详解

    经典Spring入门基础教程详解 https://pan.baidu.com/s/1c016cI#list/path=%2Fsharelink2319398594-201713320584085%2F ...

  2. Omnet++ 4.0 入门实例教程

    http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用. ...

  3. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  4. let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel

    let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...

  5. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. webpack安装配置使用教程详解

    webpack安装配置使用教程详解 www.111cn.net 更新:2015-09-01 编辑:swteen 来源:转载 本文章来为各位详细的介绍一下关于webpack安装配置使用教程吧,这篇文章对 ...

  7. QuartusII13.0使用教程详解(一个完整的工程建立)

    好久都没有发布自己的博客了,因为最近学校有比赛,从参加到现在都是一脸懵逼,幸亏有bingo大神的教程,让我慢慢走上了VIP之旅,bingo大神的无私奉献精神值得我们每一个业界人士学习,向bingo致敬 ...

  8. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  9. windows上安装Anaconda和python的教程详解

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

随机推荐

  1. String 基本使用方法, 以及要注意的事项

    package chengbaoDemo; public class Test01 { public static void main(String[] args) { //字符串的两种创建形式 St ...

  2. 关于excel导入、导出(POI)

    当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...

  3. intel dpdk在ubuntu12.04中測试testpmd、helloworld程序

    一.測试环境 操作系统:ubuntu12.04   x86_64 dpdk版本号:1.6.0r2 虚拟机:vmware 10 网卡: Intel Corporation 82545EM Gigabit ...

  4. EasyUI----动态拼接EasyUI控件

    近期在做的项目中.依据查询到的数据,然后动态的拼接easyUI的控件显示到界面上. 在数据库中,有一个命令的表,另一个參数的表,先到命令的表中去查询这一个设备有哪些命令,比方说.摄像头有一个转动的命令 ...

  5. Codeforces Round #260 (Div. 1) 455 A. Boredom (DP)

    题目链接:http://codeforces.com/problemset/problem/455/A A. Boredom time limit per test 1 second memory l ...

  6. iOS-UIApplication详解

    UIApplication简介 UIApplication对象是应用程序的象征. 每一个应用程序都有自己的UIApplication对象,而且是单例. 一个iOS程序启动后创建的第一个对象就是UIAp ...

  7. HIT Software Construction Lab 3

    ​ 2019年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...

  8. centos 部署 .net core runtime 环境

    除非在linux下开发才安装SDK,一般生产环境只需安装 runtime 1.添加 yum 源 sudo rpm --import https://packages.microsoft.com/key ...

  9. tp5页面跳转,空控制器空方法

    namespace app\index\controller; use think\Controller; class Login extends Controller{ //显示html页面 pub ...

  10. ​Java面向对象的概念整理

    Java中一切皆是对象! 注意:8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有成员变量.方法可以被调用. 为解决8种基本数据类型不能当成Object类型(所有 ...