1.work-queue:各个消费者依次取消息,均匀公平,多个消费者之间是竞争关系
生产者产生10条记录
for (int i = 0; i < 10; i++) {
String body=i+":work_queue";
channel.basicPublish("","work_queue",null,body.getBytes());
}
消费者1消费1,3,5,7,9条
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
body:1:work_queue
body:3:work_queue
body:5:work_queue
body:7:work_queue
body:9:work_queue
SLF4J: Defaulting to no-operation (NOP) logger implementation
消费者2消费0,2,4,6,8条
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
body:0:work_queue
body:2:work_queue
body:4:work_queue
body:6:work_queue
body:8:work_queue
- Pub/Sub订阅模式
加入交换机,服务提供者将消息发给交换机,Topic交换机将消息路由给消费者
交换机Exchange的三种类型:Fanout广播,Diret定向,通配符:把消息交给符合路由模式的队列
2.1 Fanout广播
//创建交换机,修改交换机类型为Fanout
String exchangeName="test_fanout";
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,false,null);
//创建queue
String queue1Name="test_fanout_queue1";
String queue2Name="test_fanout_queue2";
channel.queueDeclare(queue1Name,true,false,false,null);
channel.queueDeclare(queue2Name,true,false,false,null);
//绑定交换机和队列
// queueBind(String queue, String exchange, String routingKey),如果交换机的类型为fanout,routingKey设为""
channel.queueBind(queue1Name,exchangeName,"");
channel.queueBind(queue2Name,exchangeName,"");
所有绑定队列均可收到消息
2.2 Diret定向,加入routingKey
//创建交换机,交换机类型Direct
String exchangeName="test_route";
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,false,null);
//绑定交换机和队列
// queueBind(String queue, String exchange, String routingKey),如果交换机的类型为fanout,routingKey设为""
channel.queueBind(queue1Name,exchangeName,"error");
channel.queueBind(queue2Name,exchangeName,"error");
channel.queueBind(queue2Name,exchangeName,"info");
发送消息时也要加routingKey
//发送消息
String body="日志:xu调用了》》》,日志级别:info";
channel.basicPublish(exchangeName,"info",null,body.getBytes());
这里消费者1取queue1,消费者2取queueu2
routingKey为info时
消费者1:收到消息
D:\devtools\java\java11\bin\java.exe "-javaagent:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=50967:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=GBK -classpath D:\projects\rabbitmq\rabbitmq-consumer\target\classes;C:\Users\16925\.m2\repository\com\rabbitmq\amqp-client\5.6.0\amqp-client-5.6.0.jar;C:\Users\16925\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar com.jianhua.rabbitmq.Consumer_Route2
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
body:日志:xu调用了》》》,日志级别:info
将日志信息打印到控制台
消费者2:没有收到消息
D:\devtools\java\java11\bin\java.exe "-javaagent:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=51118:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=GBK -classpath D:\projects\rabbitmq\rabbitmq-producer\target\classes;C:\Users\16925\.m2\repository\com\rabbitmq\amqp-client\5.6.0\amqp-client-5.6.0.jar;C:\Users\16925\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar com.jianhua.rabbitmq.Producer_Route
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
将发送的消息routingKey修改为error再次执行
//发送消息
String body="日志:xu调用了》》》,日志级别:error";
channel.basicPublish(exchangeName,"error",null,body.getBytes());
消费者1:收到消息
D:\devtools\java\java11\bin\java.exe "-javaagent:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=50926:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=GBK -classpath D:\projects\rabbitmq\rabbitmq-consumer\target\classes;C:\Users\16925\.m2\repository\com\rabbitmq\amqp-client\5.6.0\amqp-client-5.6.0.jar;C:\Users\16925\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar com.jianhua.rabbitmq.Consumer_Route1
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
body:日志:xu调用了》》》,日志级别:error
将日志信息存到数据库
消费者2:收到消息
D:\devtools\java\java11\bin\java.exe "-javaagent:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=50967:D:\devtools\JetBrains\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=GBK -classpath D:\projects\rabbitmq\rabbitmq-consumer\target\classes;C:\Users\16925\.m2\repository\com\rabbitmq\amqp-client\5.6.0\amqp-client-5.6.0.jar;C:\Users\16925\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar com.jianhua.rabbitmq.Consumer_Route2
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
body:日志:xu调用了》》》,日志级别:info
将日志信息打印到控制台
body:日志:xu调用了》》》,日志级别:error
将日志信息打印到控制台
2.3 Topic主题模式,类似于模糊匹配 表示一个单词,#号表示0个或多个单词 例如.test,test.#