RabbitMQ消息队列之“Hello World”(一)

            本系列文章翻译自www.rabbitmq.com/tutorials/tutorial-one-java.html,为了方便以后学习,特意翻译了下来!通过本系列文章将会让你对RabbitMQ有个简单料及并且

会简单使用它!


这些教程包括创建使用RabbitMQ的消息应用程序的基础知识。您需要安装要RabbitMQ服务器 - 在此我们将单独写篇文章介绍RabbitMQ服务器在Ubuntu下的安装以及ERlang环境的安装。

当然,装完服务器之后,才能进行我们接下来的操作~~


RabbitMQ是一个消息代理。本质上,它从生产者那里接受消息,并把消息分发发给消费者。在两者之间,它可以根据你设定的规则路由,缓冲,持久化消息。

<1>生产方式无非就是发送消息,我们将发送消息的程序成为“生产者”即producer,我们用“P”来表示:


                                                 


<2>队列是一个“邮箱”的名字,它在RabbitMQ里面。虽然消息通过RabbitMQ和应用程序,它可以存储在消息队列里面,队列是不受任何约束的,可以根据需求存储尽可能多的消息,它本质上是一个无限的缓冲区。许多生产者可以发送一个消息队列,许多消费者可以从这个队列中接收数据。如下图所示:

                                        


<3>“消费者”意思也就是“消息接收者”,一个消费者程序就是为了等待接收消息的,我们用“C”来表示:



                                                 


需要注意的是,消费者、生产者和代理服务(也就是RabbitMQ服务器)是没必要非得在同一台机器上的,他们可以是不同服务器之间进行通讯。

大多数公司也是这么做的。RabbitMQ主要用于不同项目之间的消息传递。



接下来,我们来用java(当然也可以用python、ruby、php、c#)实现一个“Hello World”的例子:


  

在本节中,我们将用Java编写两个程序;生产者发送一个消息,消费者接收信息,并打印出来。我们先不对相关的类进行介绍。我们用一个“Hello World”消息传递的李子给大家一个简单的了解。


(P) -> [|||] -> (C)


"P"是生产者,”C“是消费者。中间的是消息队列,用来缓存生产者发送的消息。


Java客户端库 

    提到RabbitMQ就不得不说到AMQP,这是一个开放的,通用的协议进行消息传递。AMQP有许多不同语言的客户端。我们将使用RabbitMQ的所提供的Java客户端。 

    下载相关的架包,检查所描述的签名。将它解压缩到您的工作目录,并解压缩JAR文件到工作目录中: 

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

    (该RabbitMQ的Java客户端也可以在中央Maven仓库找到并下载。)


现在我们建立好了项目所需要的架包和依赖,我们可以开始写代码了:


Sending:


(P) -> [|||]


我们用Send.java来发送消息,用Recv.java来接受消息。发送者通过链接RubbitMQ服务器,并发送一个简单的消,然后退出。


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 {
      ...
  }
}

然后,我们跟RabbitMQ服务器创建一个链接:


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

这个链接是一个抽象的socket链接,并为我们提供协议的协商和认证。接下来,连接到RabbitMQ服务器上,因为我们将服务器装到了本地,所以用“localhost”,如果你装到了别的机器上,这里可以填写指定的IP或者名称。



接下来,我们创建一个”channel“这是传递或者获取消息所必需的一个类。

为了发送消息,必须声明一个队列,那么我们就可以发布一条消息队列了:


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


发送不起作用! 

    如果这是您第一次使用RabbitMQ,你看不到的“Sent”的字样,那么你可能会留抓耳挠腮想知道是什么错误。
也许是代理刚开始没有足够的可用磁盘空间(默认情况下,它需要至少1GB可用),因此拒绝接受消息。检查日志文件确认,必须减少限制。
该  配置文件  <a target=_blank target="_blank" href="http://www.rabbitmq.com/configure.html#config-items">http://www.rabbitmq.com/configure.html#config-items</a>会告诉你如何设置disk_free_limit。
 

Receiving:

接下来,我们介绍一下发送者,我们从RabbitMQ接受一条推送的消息,接收者和发送者之间有一点不同的是,接收者要不断的去监听消息,并将消息打印出来。




[|||] -> (C)


Recv.java所依赖的包:


import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.QueueingConsumer;
另外,QueueingConsumer是我们用来缓存被推送到RabbitMQ服务器上的类'


和发送者相同,我们需要打开一个链接和管道,并声明一个将要cusume的队列,注意:声明的队列名一定要和发送者的队列名保持一致。


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()的意思就是等待下一条从服务器出来的消息。


Here's the whole Recv.java class.


接下来,你就可以编译他了:

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

运行的时候,需要rabbitmq-client.jar,在终端上运行Send.java:

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

然后,运行Recv.java

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

接收者将会打印从发送者发送到RabbitMQ的消息。接收者将会一直运行着,等待接下来消息(用Ctl-C终止运行)

所以你可以多次运行发送者试一试,看看看会有什么结果!!


如果你想查看所有的队列,你可以运行以下命令:

$rabbitmqctl list_queues


好了,Hello World!到此为止,接下来进入第二篇的学习吧,建立一个工作队列~~~


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值