二、起航

本章节,柯南君将从几个层面,用官网例子讲解一下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 ./

3、程序案例

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所有源代码:
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 Exception {

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

    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();
  }
}
 
 ② 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 源代码:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.QueueingConsumer;
 
public class Recv {
 
private final static String QUEUE_NAME = "hello";
 
public static void main(String[] argv) throws Exception {
 
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 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 + "'");
}
}
}

柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)的更多相关文章

  1. 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)

    二.Work Queues(using the Java Client) 走起   在第上一个教程中我们写程序从一个命名队列发送和接收消息.在这一次我们将创建一个工作队列,将用于分发耗时的任务在多个工 ...

  2. 柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装、配置与监控

    柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装.配置与监控 一.安装 1.安装Erlang 1)系统编译环境(这里采用linux/unix 环境) ① 安装环境 虚拟机:VMw ...

  3. 看大数据时代下的IT架构(1)业界消息队列对比

    一.MQ(Message Queue) 即 消息队列,一般用于应用系统解耦.消息异步分发,能够提高系统吞吐量.MQ的产品有很多,有开源的,也有闭源,比如ZeroMQ.RabbitMQ. ActiveM ...

  4. 柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍

    一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松 ...

  5. 柯南君:看大数据时代下的IT架构(9)消息队列之RabbitMQ--案例(RPC起航)

    二.Remote procedure call (RPC)(using the Java client) 三.Client interface(客户端接口) 为了展示一个RPC服务是如何使用的,我们将 ...

  6. 柯南君:看大数据时代下的IT架构(6)消息队列之RabbitMQ--案例(Publish/Subscribe起航)

    二.Publish/Subscribe(发布/订阅)(using the Java Client) 为了说明这个模式,我们将构建一个简单的日志系统.它将包括两个项目: 第一个将发出日志消息 第二个将接 ...

  7. 柯南君:看大数据时代下的IT架构(8)消息队列之RabbitMQ--案例(topic起航)

    二.Topic(主题) (using the Java client) 上一篇文章中,我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fano ...

  8. 柯南君:看大数据时代下的IT架构(7)消息队列之RabbitMQ--案例(routing 起航)

    二.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只 ...

  9. 大数据时代下EDM邮件营销的变革

    根据研究,今年的EDM邮件营销的邮件发送量比去年增长了63%,许多方法可以为你收集用户数据,这些数据可以帮助企业改善自己在营销中的精准度,相关性和执行力. 最近的一项研究表明,中国800强企业当中超过 ...

随机推荐

  1. Spring2.0集成Quartz1.5.2调度框架

    Quartz是个开放源码项目,提供了丰富的作业调度集.希望您在阅读完本文并看过代码演示后,可以把Quartz的基本特性应用到任何Java™应用程序中.现代的Web应用程序框架在范围和复杂性方面都有所发 ...

  2. ContentProvider类的解析

    一.ContentProvider类 1.作用:专门用于不同应用之间进行数据共享的方式. 二.实现方法 1.创建ContenteProvider类 步骤一:继承ContentProvider接口,重写 ...

  3. 基于IAP和Keil MDK的远程升级设计

    写在前面:三个周之前,我突然想写一个远程升级的程序.那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知.我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题. ...

  4. linux下监视进程 崩溃挂掉后自动重启的shell脚本

    如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题.在Linux系统中,强大的shell就可以很灵活的处理这样的事务. 下面的shell通过一个while-d ...

  5. JD-GUI on Ubuntu 13.04 64-bit

    Java Decompiler (jd-gui) is a cute little tool I like using when working in Java. Unfortunately it o ...

  6. objective-c 可变参数

    容易发现Cocoa Foundation 中提供了一些可变参数的方法,如: NSLog(NSString *format, ...) 在实际的编程实践中,我们也需要自己实现可变参数的方法.在Objc中 ...

  7. IIS7性能优化:启用浏览器本地缓存

    原文地址:http://jingyan.baidu.com/article/597035521b96e88fc00740af.html

  8. Spring、编码剖析Spring管理Bean的原理

    引入dom4j jar包 1.新建Person接口和PersonBean public interface PersonIService { public void helloSpring(); } ...

  9. 两种Makefile

    .PHONY:clean CC=g++ CFLAGS=-Wall -g BIN=test_queue OBJS=Queue.o test_main.o $(BIN):$(OBJS) $(CC) $(C ...

  10. foreach真的比for性能高吗

    void Main() { ; List<int> list=new List<int>(); ;i<count;i++) { list.Add(i); } List&l ...