一.在Linux中安装RabbitMQ
虽然RabbitMQ有Windows和Mac版的,但是建议还是装在Linux中,毕竟很少有项目把Windows或Mac作为服务器使用。
安装方式一:直接在线安装
1.因为RabbitMq是使用Erlang语言编写的,所以先要配置Erlang环境
(1)安装Erlang的依赖文件
yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto
(2)下载Erlang安装包
wget -c http://erlang.org/download/otp_src_20.2.tar.gz
(3)解压
tar -zxvf otp_src_20.2.tar.gz
(4)进入otp_src_20.2文件夹中进行接下来的操作
cd otp_src_20.2/
(5)安装
执行以下命令,将Erlang安装到/usr/local/erlang目录下
./configure --prefix=/usr/local/erlang
(6)编译
make && make install
(7)测试Erlang安装情况
cd /usr/local/erlang/bin
./erl -version
出现如图效果,则表明Erlang安装成功
(8).配置Erlang环境变量,如图:
(9).检测环境变量安装情况
2.开始安装RabbitMq
(1)下载RabbitMq安装包
wget -c http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xz
(2)解压
xz -d rabbitmq-server-generic-unix-3.6.15.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.15.tar
(3)配置RabbitMq环境变量,如图
(4)RabbitMq常用命令
启动: rabbitmq-server -detached
关闭:rabbitmqctl stop
查看状态:rabbitmqctl status
设置开机启动:chkconfig rabbitmq-server on
(5)创建用户
查看用户列表:rabbitmqctl list_users
添加用户和密码:rabbitmqctl add_user admin 123456
删除用户:rabbitmqctl delete_user admin
修改密码:rabbitmqctl change_password admin 666666
(6)为新创建的用户添加权限
查看用户权限:rabbitmqctl list_user_permissions admin
设置用户权限:rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
(7)使用浏览器打开RabbitMq管理界面,如图
安装方法二:在docker容器中起RabbitMq服务
1.下载RabbitMq镜像
docker pull rabbitmq:3.7.7-management
2.起RabbitMq容器
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3.7.7-management
3.添加用户密码,以及验证参照方法一中的方法
二.写代码调用
1.maven工程先导入rabbitmq相关jar报
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
2.获取RabbitMq连接类
package com.rabbit.mq.util;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class ConnectionUtil {
public Connection getConnection() throws IOException, TimeoutException {
/*
* 创建mq连接工厂
*/
ConnectionFactory factory = new ConnectionFactory();
/*
* 配置mq连接工厂
*/
factory.setHost("192.168.*.*");
factory.setUsername("admin");
factory.setPassword("123456");
factory.setPort(5672);
/*
* 获取到mq连接
*/
Connection connection = factory.newConnection();
return connection;
}
}
3.创建生产者(发送消息)
package com.rabbit.mq.test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbit.mq.util.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
public class Producer {
private final static String EXCHANGE_NAME = "exchange_name_test";
private final static String QUEUE_NAME = "queue_name_test";
private final static String ROUTING_KEY = "routing_key_test";
public static void main(String[] args) {
Producer producer = new Producer();
try {
producer.sendMessage();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
public void sendMessage() throws IOException, TimeoutException {
ConnectionUtil util = new ConnectionUtil();
Connection connection = util.getConnection();
//创建一个信道
Channel channel = connection.createChannel();
/*
* 1.在信道中声明一个exchange
*
* 参数1:交换器名称
* 参数2:交换器类型,“direct”(直接类型)、“fanout”(扇形)、“topic”(匹配类型)、“headers”
* 参数3:设置是否持久化,设置为true 表示持久化, 反之是非持久化。持久化可以将交换器存盘,在服务器重启的时候不会丢失相关信息
* 参数4:设置是否自动删除,设置为true则表示自动删除。自动删除的前提是至少有一个队列或者交换器与这个交换器绑定,之后所有与这个
* 交换器绑定的队列或者交换器都与此解绑。注意不能错误地把这个参数理解为:"当与此交换器连接的客户端都断开时,RabbitMQ
* 会自动删除本交换器"
* 参数5:是否内置,true表示为内置的交换器,即客户端无法直接发送消息到这个交换器,只能使用其他交换器路由到此交换器
* 参数6:其他参数
*/
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, false, null);
//2.在信道中生成一个queue
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//3.将exchange和queue绑定,绑定规则为routing key
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY, null);
String message = "This is from producer2 ! !";
System.out.println(" [生产者2] Start Send Message ! ! ");
//4.发送消息,路由规则同“3”中绑定的routing key
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
System.out.println(" [生产者2] Send Message End ! !");
this.close(connection, channel);
}
public void close(Connection connection , Channel channel) throws IOException, TimeoutException {
channel.close();
connection.close();
}
}
4.创建消费者(处理消息)
package com.rabbit.mq.test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.TimeoutException;
import com.rabbit.mq.util.ConnectionUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer2 {
private final static String QUEUE_NAME="queue_name_test";
public static void main(String[] args) {
Consumer2 consumer = new Consumer2();
try {
consumer.getMesssage();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
public void getMesssage() throws IOException, TimeoutException {
ConnectionUtil util = new ConnectionUtil();
Connection connection=util.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 申明要关注的队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
/*
* DefaultConsumer类实现了Consumer接口,通过传入频道,告诉服务器我们需要哪个频道的消息
* 如果频道中有消息就会执行回调函数
*/
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag , Envelope envelope ,
AMQP.BasicProperties properties , byte[] body) throws UnsupportedEncodingException {
String message = new String(body, "UTF-8");
System.out.println("Customer Received '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
5.新创建的消息队列可以在管理器中查看到,如图: