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的一些高级用法,例如在多个消费者中均衡的调度。请拼命的打赏,让我知道这篇文章对你有用!
![](http://img.blog.csdn.net/20151218223919119?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
欢迎扫码关注我的微信公众号
老狗之前写过一篇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的一些高级用法,例如在多个消费者中均衡的调度。请拼命的打赏,让我知道这篇文章对你有用!
欢迎扫码关注我的微信公众号
相关文章推荐
- Android中Span研究
- Android XML绘图
- pgrep
- [Java开发之路](2)Java字符串
- [Java开发之路]Java字符串
- 学习Canvas绘图与动画基础 绘制多条路径(四)
- React-组件嵌套-子组件通过委托向父组件传值
- 外贸网站应该具备哪些功能
- 上锁
- hdoj 爆头 1174 (三维向量求叉积)
- P06 (*) 判断一个列表是否是回文列表
- P06 (*) 判断一个列表是否是回文列表
- 02 过滤和排序数据 -oracle学习笔记
- 黑马程序员--Collection和Collections的区别
- StandUp 定时休息软件
- 主页面布局框架搭建
- C++11: regex #3
- java多态简单例子
- Python 的数据类型
- 【PAT】因子个数