简介
由于某些原因,今天接触了一下一个新的东西RabbitMQ( http://www.rabbitmq.com/)总的来说给人的感觉就是安装简单方便,同时功能强大。而且官网也给出了几个相当实用的例子,不管关于消息队列的持久化却并没有提及,关于持久化的问题我会在后面的文章中再详细说明。不过在天朝想要直接访问RabbitMQ官网有些困难,所以建议还是安装一下fangqiang工具goagent 在Windows和Linux下都可以使用,具体信息还是自己看官网 https://code.google.com/p/goagent/
RabbitMQ的主要特点
支持一对多方式
多个Queue绑定到一个Exchange后,通过向Exchange发送消息,就可将信息转发到多个绑定到Exchange的Queue中,
消息持久化
如果对消息进行了持久话处理,那么消息队列都将保存到服务器中,即使RabbitMQ服务器停止,下一次启动消息依然存在
消息序列一致性
每个消费者对自己的Queue操作,由于Queue是消息是队列形式保存,所以可以保证绑定到同一Exchange的消息队列的信息序列是一致的
状态一致性
对于消费者可以通过设置信息分发方式,让消费者每次只从队列种取出一条信息,操作完成并确认后才发送下一条信息,当操作出现异常如宕机,未完成的消息依然保存在服务器,可以保证在下一次消费者程序启动后可以从上一次操作未完成的位置继续执行。
Linux下安装RabbitMQ
1
|
deb http:
//www
.rabbitmq.com
/debian/
testing main
|
1
2
|
wget http:
//www
.rabbitmq.com
/rabbitmq-signing-key-public
.asc
sudo
apt-key add rabbitmq-signing-key-public.asc
|
1
|
sudo
apt-get
install
rabbitmq-server
|
RabbitMQ 之Hello World
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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[] args)
throws
java.io.IOException{
//创建链接工程
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"
;
//发布消息,第一个参数表示路由(Exchange名称),未""则表示使用默认消息路由
channel.basicPublish(
""
, QUEUE_NAME,
null
, message.getBytes());
System.out.println(
" [x] Sent '"
+message+
"'"
);
//关闭消息通道和链接
channel.close();
connection.close();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import
com.rabbitmq.client.Channel;
import
com.rabbitmq.client.Connection;
import
com.rabbitmq.client.ConnectionFactory;
import
com.rabbitmq.client.QueueingConsumer;
public
class
Recv {
//消息队列名称
private
final
static
String QUEUE_NAME=
"hello"
;
public
static
void
main(String[] args)
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 message. To exist 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+
"'"
);
}
}
}
|