最近由于要和另一家公司对接数据,对方打算用消息队列RabbitMQ来对接数据,由于之前没有用过RabbitMQ,只用过activeMQ,开完会回来花了点时间学了下RabbitMQ,并把学习的过程记录下来。
1.安装Erlang
所以在安装rabbitMQ之前,需要先安装Erlang 。点击下载Erlang
我使用的是OTP 20.0
执行下载下来的Erlang,全部点击“下一步”就行。
安装完成设置一下环境变量。
2.安装RabbitMQ
下载运行rabbitmq-server-3.7.7.exe。
RabbitMQ官网
依旧可以不改变默认进行安装。
进入RabbitMQ的安装目录,执行rabbitmq-plugins.bat enable rabbitmq_management
重新启动RabbitMQ
添加用户及设置角色
此时wzw这个用户还没有 虚拟主机“/”中的写、读权限
授权(RabbitMQ默认的vhost是 /)
wzw用户和guest用户拥有一样的权限了
前面创建的用户使用的虚拟主机(virtual host)是安装RabbitMQ时默认的虚拟主机。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
下面介绍如何创建虚拟主机及授权用户使用新建的虚拟主机。
创建新的虚拟主机 “test” 和创建用户 “test” 设置用户test为administrator角色,授权用户test拥有访问虚拟主机test的所有权限。
E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl add_vhost test
Adding vhost "test" ...
E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl.bat add_user test 123456
Adding user "test" ...
E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl set_permissions -p test test .* .* .*
Setting permissions for user "test" in vhost "test" ...
E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl set_user_tags test administrator
Setting tags for user "test" to [administrator] ...
如果觉得命令行操作麻烦,可以使用浏览器打开 http://localhost:15672 访问Rabbit Mq的管理控制台,在控制台里创建用户及授权。
登录页面
登录成功首页
添加用户及授权页面
最后附上java测试代码
生产者
package org.wu.work.util;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("test");
factory.setPassword("123456");
//设置 RabbitMQ 地址
factory.setHost("localhost");
//设置RabbitMQ VirtualHost 如果不设置,则使用默认的VirtualHost:"/"
factory.setVirtualHost("test");
//建立到代理服务器到连接
Connection conn = factory.newConnection();
//获得信道
Channel channel = conn.createChannel();
//声明交换器
String exchangeName = "my_exchange";
channel.exchangeDeclare(exchangeName, "direct", true);
String routingKey = "my_key";
//发布消息
byte[] messageBodyBytes = "hello world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);
channel.close();
conn.close();
}
}
消费者
package org.wu.work.util;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("test");
factory.setPassword("123456");
factory.setHost("localhost");
//设置RabbitMQ VirtualHost 如果不设置,则使用默认的VirtualHost:"/"
factory.setVirtualHost("test");
//建立到代理服务器到连接
Connection conn = factory.newConnection();
//获得信道
final Channel channel = conn.createChannel();
//声明交换器
String exchangeName = "my_exchange";
channel.exchangeDeclare(exchangeName, "direct", true);
//声明队列
String queueName = channel.queueDeclare().getQueue();
String routingKey = "my_key";
//绑定队列,通过键 my_key 将队列和交换器绑定起来
channel.queueBind(queueName, exchangeName, routingKey);
while(true) {
//消费消息
boolean autoAck = false;
String consumerTag = "";
channel.basicConsume(queueName, autoAck, consumerTag, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
System.out.println("消费的路由键:" + routingKey);
System.out.println("消费的内容类型:" + contentType);
long deliveryTag = envelope.getDeliveryTag();
//确认消息
channel.basicAck(deliveryTag, false);
System.out.println("消费的消息体内容:");
String bodyStr = new String(body, "UTF-8");
System.out.println(bodyStr);
}
});
}
}
}
先启动消费者,然后再启动生产者。
消费者打印如下结果
参考资料:
http://www.cnblogs.com/ericli-ericli/p/5902270.html
https://www.jianshu.com/p/79ca08116d57