rabitmq-manual

一、 概述
rabbitmq作为消息队列服务,主要用以消息接受、存储和转发。我们可以简单理解为邮件服务系统,所以涉及到的主要交互终端包括发件人和收件人,在rabbitmq中被称为消息生产者(producer)和消息消费者(consumer)。下文我们主要描述如何使用最简单的Java程序与rabbitmq server进行消息交互。
二、 管理页面设置
a) 新增vHost

b) 添加用户

c) 设置用户vHost权限

三、 环境准备

  1. jdk1.6以上
  2. 依赖jar包
1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
  1. rabbitmq server 2.8以上

四、 发送端
代码中诸如vhost, username, password以及用户和vhost之间的权限关系都是在rabbitmq management 的web页面中设置的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ConnectionFactory factory = new ConnectionFactory();
//指定rabbitmq服务器地址,默认端口5672
factory.setHost("103.39.107.171");
//rabbitmq将队列、交换策略,绑定关系等抽象成Vhost,此处需要指定
factory.setVirtualHost("chaoyang");
//指定连接使用的用户名
factory.setUsername("chaoyanguser");
//指定连接使用的密码
factory.setPassword("111111");
//队列名称,就是要指定消息放到哪个通道里
String queueName = "chaoyang_queue";
//创建tcp连接
Connection connection = factory.newConnection();
//打开连接通道
Channel channel = connection.createChannel();
//申明一个队列
channel.queueDeclare(queueName, false, false, false, null);
String message = "I hate it";
//发送消息
channel.basicPublish("", queueName, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
//关闭别忘以上各种对象

五、 接受端
代码中诸如vhost, username, password以及用户和vhost之间的权限关系都是在rabbitmq management 的web页面中设置的。

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
ConnectionFactory factory = new ConnectionFactory();
//指定rabbitmq服务器地址,默认端口5672
factory.setHost("103.39.107.171");
//rabbitmq将队列、交换策略,绑定关系等抽象成Vhost,此处需要指定
factory.setVirtualHost("chaoyang");
//指定连接使用的用户名
factory.setUsername("chaoyanguser");
//指定连接使用的密码
factory.setPassword("111111");
//队列名称,就是要指定消息放到哪个通道里
String queueName = "chaoyang_queue";
//创建tcp连接
Connection connection = factory.newConnection();
//打开连接通道
Channel channel = connection.createChannel();
//申明一个队列
channel.queueDeclare(queueName, false, false, false, null);
//定义一个消息消费者对象
QueueingConsumer consumer = new QueueingConsumer(channel);
//指定要接收消息的通道
channel.basicConsume(queueName, false, consumer);
//阻塞式消息收取
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
System.out.println(" [x] Received '" + message + "'");
}
分享到