简单模式
简单模式如图所示只有生产者(p)消费者(c)
以及红色部分(队列)
编写生产者
package com.lyf.conf;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
* Date:2021/3/25
* Time:20:22
**/
public class Product {
public static void main(String[] args) throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("lyf-simple",true,false,false,null);
//发送的消息
for (int i = 1; i<=10;i++){
String sum ="哈哈哈哈哈"+i;
channel.basicPublish("","lyf-simple",null,sum.getBytes());
}
}
}
循环输入10条数据
代码接收
public class One {
public static void main(String[] args) throws Exception{
//创建连接工厂 ----配置连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
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 接受的信息
System.out.println("消息的内容:"+new String(body));
}
};
channel.basicConsume("lyf-simple",true,callback);
}
}
效果图:输出在控制台
队列中没有数据,被消费了
如果要往队列中添加数据要先将获取关掉不然会直接消费掉:
工作者模式
如图所示:一个生产者,一个队列,两个消费者
消费者是竞争关系c1那了1,c2就不能那1。一般用在批量处理上. rabbitMQ里面积压了大量的消息。
生产者代码:和上边生产者代码一样
消费者代码:
package com.on;
import com.rabbitmq.client.*;
import java.io.IOException;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
*
* @create: 2021-05-05 16:07
**/
public class Tow1 {
public static void main(String[] args) throws Exception{
//创建连接工厂 --配置连接信息
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象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("lyf-simple",true,callback);
}
}
创建两个消费者将代码中消费者1改为2就行运行后的效果
效果图:
发布订阅模式
一个生产者,一个交换机,多个队列,多个消费者
生产者代码;
package com.lyf.test;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
* Date:2021/3/25
* Time:20:22
**/
public class Product {
public static void main(String[] args) throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("lyf-publish01",true,false,false,null);
channel.queueDeclare("lyf-publish02",true,false,false,null);
//创建交换机
channel.exchangeDeclare("ban129-lyf-publish", BuiltinExchangeType.FANOUT,true);
//绑定队列
channel.queueBind("lyf-publish01","ban129-lyf-publish","");
channel.queueBind("lyf-publish02","ban129-lyf-publish","");
//发送的消息
for(int i=0;i<10;i++) {
String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
channel.basicPublish("ban129-lyf-publish","",null,sum.getBytes());
}
}
}
图形化界面中添加了两个队列每个有十条数据
消费者代码:
package com.confa;
import com.rabbitmq.client.*;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
* Date:2021/3/25
* Time:20:22
**/
public class Consumer02 {
public static void main(String[] args) throws Exception{
//创建连接工厂 ----配置连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//接收的信息
DefaultConsumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
System.out.println("2内容="+new String(body));
}
};
channel.basicConsume("lyf-publish02",false,consumer);
}
}
两个消费者将内容前的数字改一下
效果图:在控制台输出,消费者1和2都有数据
路由模式
特点:
1.一个生产者
2.多个消费者
3.多个队列。
4.交换机 转发消息。
5.routekey:路由key 只要routekey匹配的消息可以到达对应队列。
生产者代码
package com.lyf.product;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
* Date:2021/3/25
* Time:20:22
**/
public class Product {
public static void main(String[] args) throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("lyf-routing01",true,false,false,null);
channel.queueDeclare("lyf-routing02",true,false,false,null);
//创建交换机
channel.exchangeDeclare("ban129-lyf-routing",BuiltinExchangeType.DIRECT,true);
channel.queueBind("lyf-routing01","ban129-lyf-routing","error");
channel.queueBind("lyf-routing02","ban129-lyf-routing","error");
channel.queueBind("lyf-routing02","ban129-lyf-routing","info");
channel.queueBind("lyf-routing02","ban129-lyf-routing","warning");
//发送的消息
for (int i = 1; i<=10;i++){
String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
//info是路由key只有符合时才能传入数据
channel.basicPublish("ban129-lyf-routing","info",null,sum.getBytes());
}
}
}
图形化截图
为error时
两个队列都有数据
topic主体模式
一个生产者,一个交换机,
交换机和队列绑定按照通配符的模式。
*: 统配一个单词。
#: 统配n个单词
,多个队列,多个消费者
生产者代码:
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* Created by IntelliJ IDEA.
* User:liuyaf
* Date:2021/3/25
* Time:20:22
**/
public class Topic {
public static void main(String[] args) throws Exception {
//创建连接工厂 --配置连接信息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.79.188");
//创建连接对象
Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare("lyf-f-topic01",true,false,false,null);
channel.queueDeclare("lyf-f-topic02",true,false,false,null);
//创建交换机
channel.exchangeDeclare("ban129-lyf-topic",BuiltinExchangeType.TOPIC,true);
channel.queueBind("lyf-f-topic01","ban129-lyf-topic","*.lyf.*");
channel.queueBind("lyf-f-topic02","ban129-lyf-topic","*.*.lyf");
channel.queueBind("lyf-f-topic02","ban129-lyf-topic","lazy.#");
//发送的消息
for (int i = 1; i<=10;i++){
String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
//a.lyf.a是通配符绑定,通配符可自己设置
channel.basicPublish("ban129-lyf-topic","a.lyf.a",null,sum.getBytes());
}
}
}
消费者代码跟上边一样,只需要将队列名改一下