您的位置:首页 > 其它

RabbitMQ学习笔记(一)

2015-12-18 22:38 507 查看
很抱歉在这个周末没有延续大家喜闻乐见的远古程序员系列,而是弄了这么一篇枯燥的技术性文章。主要是因为工作需要,老狗这一周都在研究RabbitMQ,不趁热把学习心得写出来,有些知识点老狗自己都怕时间一长给忘却了。为了不让大家就此失去读下去的兴趣,老狗将使出浑身解数,尽量将无趣的技术说的声情并茂一些。

老狗之前写过一篇RabbitMQ的安装笔记,在那篇文里对RabbitMQ有个简单的定义,这里不再冗述。这里简单介绍一下RabbitMQ中的一些基本概念:

生产 (Producing):RabbitMQ的黑话,其实就是发送消息,一个发送消息的程序就叫做生产者(Producer)。

队列(Queue):本质上是一个长度无限制的缓存,由RabbitMQ维护和管理,消息经由这个缓存在程序间流动,理论上说你可以向队列中插入任意数量的消息。

消费(Consuming):又是黑话,意思是接收消息,等待接收队列中消息的程序叫消费者(Consumer)。

接下来我们准备用Java编写第一个RabbitMQ程序,按国际惯例第一个程序命名为“Hello World”,祭给Brian Kernighan大牛。

首先把RabbitMQ的jar包拷贝到你的项目目录下,jar包在这里下载:http://www.rabbitmq.com/java-client.html

本狗为了显得高端大气与众狗狗不同,没有用拷贝到lib目录的方法在项目中引入jar包。本狗是这样做的,首先把jar包都拷贝到一个公共目录下,比如CommonLibrary,然后在Eclipse中右键项目,选择Build Path--->Add External Archives,在打开的窗口中选择所有的jar包。这样做的好处是如果有多个项目都要引用RabbitMQ的jar包,不需要把jar包拷来拷去的,更重要的,显得大爷我就是比你们会玩Eclipse啊哈哈哈哈,你们这些弱逼还不献上膝盖!

淡定,淡定一下,现在来看我们第一个生产者程序:

// 首先要引入这些

import java.io.IOException;

import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

// 主程序是这样写的

public class Send {

private final static String QUEUE_NAME = "hello";

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

ConnectionFactory factory = new ConnectionFactory();

//假设你的RabbitMQ安装在本机,这里也可以写上IP地址

factory.setHost("localhost");

Connection connection = null;

Channel channel = null;

try {

connection = factory.newConnection();

channel = connection.createChannel();

// 先不管这里的一连串false的含义,后面会慢慢讲到

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

String message = "hello world!";

channel.basicPublish("",QUEUE_NAME, null, message.getBytes());

System.out.println("[Producer] Sent " + message + " to " + QUEUE_NAME);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (TimeoutException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (null != channel) {

try {

channel.close();

} catch (IOException | TimeoutException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (null != connection) {

try {

connection.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

注意在官网上的示例代码都没有捕获和处理异常,实际上那是行不通的,可能抛出的几个检查型异常必须捕获并处理。

接下来我们再建一个项目作为消费者(Consumer),同样需要引用RabbitMQ的jar包。以下是代码:

import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.Connection;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Consumer;

import com.rabbitmq.client.DefaultConsumer;

import com.rabbitmq.client.Envelope;

public class ReceiverMain {

private final static String QUEUE_NAME = "Hello";

public static void main(String[] args) {

// 同样要先建立到RabbitMQ的连接

ConnectionFactory factory = new ConnectionFactory();

factory.setHost(“localhost”);

try {

final Connection connection = factory.newConnection();

final Channel channel = connection.createChannel();

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

System.out.println("[Consumer] Waiting for messages. To exit press Ctrl + C ");

// 这里用一个方法内部类来供RabbitMQ的方法回调处理消息,典型的命令模式

final 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("[Consumer] Received '" + message + "'");

}

};

// 回调内部类,处理消息,先不管true参数的含义,后面会有详细解释

channel.basicConsume(QUEUE_NAME, true, consumer);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (TimeoutException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

到此一个应用RabbitMQ的基本程序就完成了,接下来我们先后执行生产者和消费者程序,来看下消息的传递。

执行程序时要指定RabbitMQ的jar包所在的位置,否则应用程序自己是找不到相关jar包的,我是这样指定的:

首先进入到项目的bin目录下,用相对路径指定jar包位置和class文件所在位置。

java -cp .:../../CommonLibrary/commons-io-1.2.jar:../../CommonLibrary/commons-cli-1.1.jar:../../CommonLibrary/rabbitmq-client.jar com.halo.main.StudyMain

注意com.halo.main是我的包路径。现在生产者程序启动了,接下来启动消费者程序:

java -cp .:../../CommonLibrary/commons-io-1.2.jar:../../CommonLibrary/commons-cli-1.1.jar:../../CommonLibrary/rabbitmq-client.jar com.halo.main.ReceiverMain

如果你用Maven编译了两个程序并生成可执行文件,就不用这么麻烦,那是后话,我们以后再说。

老狗觉得这篇文章写的还是太枯燥了,大家有用到的时候再拿来做参考吧。如果大家有需要,下一章我们继续讲解RabbitMQ的一些高级用法,例如在多个消费者中均衡的调度。请拼命的打赏,让我知道这篇文章对你有用!



欢迎扫码关注我的微信公众号

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: