一、概念
- RabbitMQ是一个开源的遵循AMQP协议实现的机遇Erlang语言编写、支持多种客户端。用于在分布式系统中存储消息、转发消息,具有高可用、高可扩、高可靠、易用性等特征
- download
二、常用命令
# 创建一个用户
rabbitmqctl add_user yoho8 yoho8
# 分配角色
rabbitmqctl set_user_tags yoho8 administrator
# 角色授权
rabbitmqctl set_permissions yoho8 ".*" ".*" ".*"
三、简单模式 代码
// 生产者
public class Send {
// 声明通道名称
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try {
// 创建连接connection
Connection connection = factory.newConnection();
// 通过连接获取通道Channel
Channel channel = connection.createChannel();
/*
* 声明通道
* @params1 队列的名称
* @params2 是否要持久化,true-持久化,false-非持久化;非持久化会存盘,但是会随着服务重启而丢失
* @params3 排他性,是否是独占独立
* @params4 是否自动删除,随着最后一个消费者消息完毕以后是否把队列自动删除
* @params5 携带附属参数
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 准备消息内容
String message = "Hello World!";
// 发送消息给队列queue
// @params1 交换机,exchange
// @params2 队列、路由key
// @params3 消息状态控制
// @params4 消息主体
// 可以存在没有交换机的队列吗?不可能,虽然没有指定交换机,但是一定会存在一个默认的交换机。消息一定是通过交换机投递给queue的
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
} catch() {
} final {
}
}
}
// 接收者
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
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 messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}