RabbitMQ的原理
(1)producer:生产者 发生的消息
(2)Connection: 连接对象,通过TCP协议建立生产者和RabbitMQ服务器连接。非常耗资。
(3)Channel:信道。 虚拟的连接。通过该连接可以发送消息,而且耗资很少。
(4)exchange: 交换机。 把信息转发到对应的队列里。它不负责消息的存放。
(5)Queue:队列,用于存储消息。
(6)Binding:用户绑定交换机和队列。
(7)Broker: 理解为rabbitMQ服务器。
(8)Virtual Host: 虚拟主机: 一个RabbitMQ服务器中由很多虚拟主机,而每一个虚拟主机,都是独立的。里面都要自己的exchange,queue.
简单模式
p 【product】: 生产者 发生消息的
红色[queue]: 队列。 存储消息的
C [consumer]: 消费者 消费消息
生产者代码
public class Product {
public static void main(String[] args)throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
//创建连接对象Connection
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//创建队列
/**
* String queue, 队列的名称
*/
channel.queueDeclare("aaa_queue",true,false,false,null);
//发生消息
String msg="滚吧";
channel.basicPublish("","aaa_queue",null,msg.getBytes());
}
}
消费者代码
public class Consumer {
public static void main(String[] args) throws Exception{
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//接受消息
DefaultConsumer callback=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//body 接受的信息
System.out.println("消息的内容:"+new String(body));
}
};
channel.basicConsume("aaa_queue",true,callback);
}
}
工作者模式
特点:一个生产,多个消费,统一队列,消费是竞争关系
生产者代码
public class Product {
public static void main(String[] args)throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
//创建连接对象Connection
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("aaa_queue_work",true,false,false,null);
//发生消息
for(int i=0;i<10;i++) {
String msg = "哈哈哈"+i;
channel.basicPublish("", "aaa_queue_woou", null, msg.getBytes());
}
//生产者这里可以管理资源 消费者不能关闭资源。
channel.close();
connection.close();
}
}
消费者(1)
public class Consumer01 {
public static void main(String[] args) throws Exception{
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
//创建连接对象Connection
Connection connection=factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//接受消息
/**
* (String queue, 队列的名称
* boolean autoAck, 是否自动确认
* Consumer callback: 回调方法 当队列中存在信息后 会自动触发回调函数。
*/
DefaultConsumer callback=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//body 接受的信息
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者01:"+new String(body));
}
};
channel.basicConsume("aaa_queue_woou",true,callback);
}
}
消费者(2)
public class Consumer02 {
public static void main(String[] args) throws Exception{
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//接受消息
DefaultConsumer callback=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//body 接受的信息
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者1号:"+new String(body));
}
};
channel.basicConsume("aaa_queue_woou",true,callback);
}
}
发布订阅模式
一个 生产,多个消费,多个队列,(x)交换机
public class Product {
public static void main(String[] args)throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("aaa_queue_fanout01",true,false,false,null);
channel.queueDeclare("aaa_queue_fanout02",true,false,false,null);
//创建交换机
/**
* String exchange,交换机的名称
* BuiltinExchangeType type, 交换机的类型
* boolean durable:是否持久化
*/
channel.exchangeDeclare("ban129_exchange", BuiltinExchangeType.FANOUT,true);
channel.queueBind("aaa_queue_fanout01","ban129_exchange","");
channel.queueBind("aaa_queue_fanout02","ban129_exchange","");
//发生消息
for(int i=0;i<10;i++) {
String msg = "订阅模式"+i;
channel.basicPublish("aaa_exchange", "", null, msg.getBytes());
}
//生产者这里可以管理资源 消费者不能关闭资源。
channel.close();
connection.close();
}
}
消费者
public class Consumer01 {
public static void main(String[] args) throws Exception{
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
DefaultConsumer callback=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//body 接受的信息
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者1号:"+new String(body));
}
};
channel.basicConsume("aaa_queue_fanout01",true,callback);
}
}
路由模式
public class Product {
public static void main(String[] args)throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("aaa_queue_direct01",true,false,false,null);
channel.queueDeclare("aaa_queue_direct02",true,false,false,null);
//创建交换机
channel.exchangeDeclare("aaa_exchange_direct", BuiltinExchangeType.DIRECT,true);
channel.queueBind("aaa_queue_direct01","ban129_exchange_direct","error");
channel.queueBind("aaa_queue_direct02","ban129_exchange_direct","info");
channel.queueBind("aaa_queue_direct02","ban129_exchange_direct","error");
channel.queueBind("aaa_queue_direct02","ban129_exchange_direct","warning");
for(int i=0;i<10;i++) {
String msg = "路由模式"+i;
channel.basicPublish("aaa_exchange_direct", "error", null, msg.getBytes());
}
//生产者这里可以管理资源 消费者不能关闭资源。
channel.close();
connection.close();
}
}
topic主体模式
*: 统配一个单词。
#: 统配n个单词
public class Product {
public static void main(String[] args)throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.247.129");
Connection connection=factory.newConnection();
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("aaa_queue_topic01",true,false,false,null);
channel.queueDeclare("aaa_queue_topic02",true,false,false,null);
//创建交换机
channel.exchangeDeclare("aaa_exchange_topic", BuiltinExchangeType.TOPIC,true);
channel.queueBind("aaa_queue_topic01","ban129_exchange_topic","*.orange.*");
channel.queueBind("aaa_queue_topic02","ban129_exchange_topic","*.*.rabbit");
channel.queueBind("aaa_queue_topic02","ban129_exchange_topic","lazy.#");
//发生消息
for(int i=0;i<10;i++) {
String msg = "德玛西亚!!!!"+i;
channel.basicPublish("aaa_exchange_topic", "lazy.orange.rabbit", null, msg.getBytes());
}
//生产者这里可以管理资源 消费者不能关闭资源。
channel.close();
connection.close();
}
}