`
songkaiang
  • 浏览: 4689 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RabbitMQ入门(1)--介绍

 
阅读更多

本文章转发自http://my.oschina.net/OpenSourceBO/blog/379732

 

前面声明本文都是RabbitMQ的官方指南翻译过来的,由于本人水平有限难免有翻译不当的地方,如发现不对的地方,请联系下我,好及时改正。好了,正文开始:

RabbitMQ 是一个消息代理。这主要的原理十分简单,就是通过接受和转发消息。你可以把它想象成邮局:当你将一个包裹送到邮局,你会相信邮递员先生最终会将邮件送到接件人手上。RabbitMQ就好比一个邮箱,邮局或邮递员。

邮局和RabbitMQ两种主要的不同之处在于,RabbitMQ不处理文件,而是接受,并存储和以二进制形式将消息转发。

RabbitMQ,在消息的传送过程中,我们使用一些标准称呼。

生产过程就像发送过程,发送消息的程序就是一个生产者,我们使用“P”来描述它。

producer

队列是好比邮筒的称呼,它位于RabbitMQ内部,虽然消息流通过RabbitMQ和你的应用程序,但是它们仅仅存储在队列中。一个队列没有范 围限制,你可以想存储多少就存储多少,本质上来说它是无限大的缓存。多个生产者可以通过一个队列发送消息,同样多个消费者也可以通同一个消息队列中接收消 息。队列是画成这样,名字在它的上面:

queue

消费过程与接收相似,一个消费者通常是一个等着接受消息的程序,我们使用"C"来描述:

consumer

注意,那生产者,消费者和代理者不需要一定在一个机器上,事实上,大多数应用程序中,他们并不在一个机器上。

“Hello World”

(使用java客户端)

在这部分指南中,我们将要使用java写两个程序;一个发送简单消息的生产者和一个接收消息并输出出来的消费者。我们会忽视掉一些Java API的细节,为了开始仅仅精选在这简单的事情上,这是一个"Hello World"消息。

java-one

Java 客户端库
RabbitMQ 遵循AMQP协议,那是一个开放的,并且通用的消息协议。在不同语言中有数种AMQP客户端,我们使用由RabbitMQ提供的Java客户端。
下载客户端库包,检验签名,将它解压缩到你的工作路径,从解压到的路径中提取JAR文件:

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

(RabbitMQ Java客户端也存在Maven中央库中,groupIdcom.rabbitmq,artifactIdamqp-client.)

现在我们已经有了Java客户端和依赖文件,我们可以写一些代码了。

发送

sending.png

我们将会让我们的消息发送者发送消息,我们的接收者接收消息。发送者连接到RabbitMQ上,发送一个简单的消息,然后退出。

Send.java,我们需要引入一些类:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

建立这个类,为队列命名:

public class Send {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv)
      throws java.io.IOException {
      ...
  }
}

接着,我们创建一个服务器的连接:

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

抽象的socket连接,注意协议版本的处理以及授权,诸如此类的事情。
这里我们连接到本地机器上的代理,因此它是localhost。如果我们想连接到不同机器上的代理,只需要说明它的主机名和IP地址。

接下来我们创建一个通道,获取操作的大多数API都位于这上。

对于发送,我们必须声明一个发送队列,然后我们把消息发送到这个队列上:

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 + "'");

Declaring a queue is idempotent - it will only be created if it doesn't exist already. The message content is a byte array, so you can encode whatever you like there.

Lastly, we close the channel and the connection;
声明一个队列是幂等的,仅仅在要声明的队列不存在时才创建。消息内容是二进制数组,所以你可以随你喜好编码。

channel.close();

connection.close();

Here's the whole Send.java class.

发送没有起作用

如果你是第一次使用RabbitMQ并且你没有看到"Sent"消息,你可能抓耳挠腮的想到底是哪里出的问题。可能是代理启动时没有足够空间(默 认它需要至少1Gb 空间),因此拒绝接受消息。通过检查代理的日志文件来确定这个问题,必要情况下可以降低限制大小。配置文件的文档将会告诉你怎样设置disk_free_limit

接收

上面代码是构建我们的发送者。我们的接收者是从RabbitMQ中提取消息,所以不像发送者那样发送一个简单的消息,我们需要一直运行监听消息并且输出消息。
receiving

Recv.java中的代码有与Send中几乎相同的引用:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.QueueingConsumer;

这额外的QueueingConsumer类是用来缓存从服务器那里发出来的信息。

跟创建发送者相同,我们打开一个连接和一个通道,声明一个我们要消费的队列。注意要与发送的队列相匹配。

             java.lang.InterruptedException {

  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类。

把所有放在一起

你可以在RabbitMQ Java客户端的类路径上编译这些文件:

$ javac -cp rabbitmq-client.jar Send.java Recv.java

为了运行它们,你需要rabbitma-client.jar和它在类路径上的的依赖文件。在一个终端上,运行发送者:

$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Send

然后,运行接收者:

$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Recv

在windows环境中,我们使用分号代替冒号来分隔类路径上的选项。

接收者将会输出从RabbitMQ中获取到来自发送者的消息。接收者会一直保持运行,等待消息(使用Ctrl-C停止),所以试着用另一个终端运行发送者。
如果你想检验队列,试着使用rabbitmqctl list_queues0

Hello World!

时间移动到第二部分,构建一个简单的工作队列。

提示
为了保存输入,你可以将类路径设置到环境变量中

\$ export CP=.:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar
\$ java -cp $CP Send

或者在 Windows环境中:

\> set CP=.;commons-io-1.2.jar;commons-cli-1.1.jar;rabbitmq-client.jar
\> java -cp %CP% Send
分享到:
评论

相关推荐

    MQ示例+otp_win64_22.2.exe+rabbitmq-server-3.8.1

    【标题】"MQ示例+otp_win64_22.2.exe+rabbitmq-server-3.8.1" 提供的是一个与消息队列相关...总的来说,这个压缩包是一个全面的入门资源,对于想要学习和实践消息队列技术,特别是 RabbitMQ 的开发者来说,非常有价值。

    RabbitMQ入门-实战-RabbitMQ.zip

    **RabbitMQ 入门与实战** RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol)协议的开源消息队列系统,它被广泛应用于分布式系统中的消息传递和任务调度。RabbitMQ 提供了高可用性、可扩展性和可靠性...

    RabbitMQ入门小Dome ------> RabbitMQDome.zip

    最近整理学习的RabbitMQ入门Dome,文件是一个普通java项目导入完成后在lib文件夹中amqp-client-5.2.0.jar,slf4j-api-1.7.25.jar添加进去即可,里面有5个dome分是 dome1 : 简单队列,dome2 :work模式,dome3 : 订阅...

    RabbitMQ快速入门及API介绍(401M)

    【课程目录】:---第一章:RabbitMQ介绍----1-什么是消息中间件.mp4----2-RabbitMQ消息队列安装:window环境.mp4----3-RabbitMQ消息队列安装 :Linux环境.mp4----4-Rabbitmq入口示例:server.mp4----5-rabbitmq入口...

    RabbitMQ中文文档-.rar

    首先,"Hello Word"章节是入门教程,介绍了RabbitMQ的基本概念和安装步骤。这里会讲解如何启动和关闭服务器,以及如何通过简单的示例来发送和接收第一条消息。这个阶段的目标是帮助初学者快速建立起对RabbitMQ工作的...

    RabbitMQ.pdf-详情

    首先,我们从快速入门开始,创建一个包含生产者和消费者的项目。生产者是发送消息的组件,而消费者则是接收和处理这些消息的组件。在项目结构中,我们可以看到两个子模块:`rabbitmq-producer`和`rabbitmq-consumer`...

    5-2 RabbitMQ入门 - EMOS小程序1

    1. docker load < rabbitmq.tar.gz 1. 简单模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式

    rabbitmq-service-util:使访问 RabbitMQ 服务插件变得超级简单

    入门 将 ruby​​gem 添加到应用程序的 Gemfile 中: gem 'rabbitmq-service-util' 用法 require 'rabbitmq-service-util' # If using the amqp gem connection = AMQP.connect(RabbitMQ::amqp_connection_url) #...

    RabbitMQ-Pub-Sub-Sample:RabbitMQ入门

    1. **RabbitMQ基本概念**: - **节点(Node)**:RabbitMQ服务器的实例。 - **交换机(Exchange)**:接收生产者发送的消息,并根据预设规则分发到对应的队列。 - **队列(Queue)**:存储消息的地方,直到被消费...

    RabbitMQ-Day1-Code

    RabbitMQ-Day1-Code 是一个学习RabbitMQ基础的项目,包含了入门第一天的所有编程示例,主要分为两个部分:`rabbitmq-producer` 和 `rabbitmq-consumer`。这两个部分分别对应了消息队列中的生产者和消费者角色。 ...

    rabbitmq-nodejs-demos:带有AMQP协议的RabbitMQ DemosTutorials。 [NodeJS]

    但是在本演示/教程中,我使用了AMQP 0-9-1 ,这是一种开放的通用消息传递协议。要求入门想运行我的演示代码: 克隆存储库: git clone < Repository>cd rabbitmq-nodejs-demos 安装所有依赖项: npm install 想要...

    Rabbitmq入门到精通.doc

    【RabbitMQ 入门到精通】:RabbitMQ 是一款流行的消息中间件,它基于 AMQP(Advanced Message Queuing Protocol)协议实现,用于在分布式系统中高效地传输消息,从而实现异步处理、解耦和流量控制。本教程旨在帮助...

    rabbitMq入门

    【标题】:“rabbitMQ入门” 在IT行业中,消息队列是一种常见的中间件技术,用于解耦应用程序组件,提高系统的可扩展性和可靠性。RabbitMQ是一个开源的消息代理和队列服务器,广泛应用于分布式系统中。本篇文章将带...

    RabbitMQ_Project.zip

    在这个名为“RabbitMQ_Project.zip”的压缩包中,包含了学习和实践RabbitMQ基础概念和模式的入门实例。以下是对这些概念的详细说明: 1. **简单队列**:这是RabbitMQ最基础的使用方式,生产者发送消息到队列,消费...

    RabbitMQ入门介绍,初学者宝典

    RabbitMQ入门介绍,初学者宝典,chm文档,方便阅读。

    rabbitmq-tutorial-php-demo:RabbitMQ官方中文入门教程(PHP版)演示源码-php

    "rabbitmq-tutorial-php-demo" 指的是一个基于PHP的RabbitMQ入门教程的演示项目。RabbitMQ是一个流行的开源消息代理和队列服务器,它使用AMQP(Advanced Message Queuing Protocol)协议来实现高效、可靠的消息传递...

    rabbitmq-c:RabbitMQ C客户端

    介绍 这是C语言AMQP客户端库,可与代理的v2.0 +一起使用。 有关该库的公告会定期在rabbitmq-c用户上发布,并交叉发布到rabbitmq-users。 最新稳定版 可以在以下位置找到rabbitmq-c的最新稳定版本: 文献资料 v...

    RabbitMQ从入门到放弃

    ### RabbitMQ从入门到放弃——理解消息队列与RabbitMQ #### 消息队列简介 消息队列(Message Queue, MQ)作为一种重要的中间件技术,它提供了应用程序间的一种通信方式,通过写入和读取出入列队的消息来进行通信,...

    20.消息中间件之RabbitMQ入门讲解

    消息中间件之RabbitMQ入门讲解”的主题中,我们将深入理解RabbitMQ的核心概念,如何通过控制台进行管理,以及如何在Spring Cloud框架下创建消息生产者和消费者。 首先,让我们了解RabbitMQ的基本概念。RabbitMQ的...

Global site tag (gtag.js) - Google Analytics