RabbitMQ 路由队列
应用场景:有些消费者能收,有些消费者不能收。
官网:https://www.rabbitmq.com/tutorials/tutorial-four-java.html
1.创建一个生产者 Send.java:
package com.ckfuture.direct.send; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.nio.charset.StandardCharsets; /** * 路由队列-消息生产者 */ public class Send { //定义交换机名称 private final static String EXCHANGE_NAME = "exchange_direct"; public static void main(String[] argv) throws Exception { //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //连接工厂的地址 factory.setHost("localhost"); try ( //连接工厂创建连接 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel()) { //绑定交换机 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); String infoMessage = "普通信息!"; String errorMessage = "错误信息!"; String warningMessage = "警告信息!"; //路由key String infoRoutingKey="info"; String errorRoutingKey="error"; String warningRoutingKey="warning"; //发送消息 channel.basicPublish(EXCHANGE_NAME, infoRoutingKey, null, infoMessage.getBytes(StandardCharsets.UTF_8)); channel.basicPublish(EXCHANGE_NAME, errorRoutingKey, null, errorMessage.getBytes(StandardCharsets.UTF_8)); channel.basicPublish(EXCHANGE_NAME, warningRoutingKey, null, warningMessage.getBytes(StandardCharsets.UTF_8)); System.out.println(" [x] Sent '" + infoMessage + "'"); System.out.println(" [x] Sent '" + errorMessage + "'"); System.out.println(" [x] Sent '" + warningMessage + "'"); } } }
2.创建第一个消费者Recv01.java:
第一个消费者只能接收 error消息
package com.ckfuture.direct.recv; import com.rabbitmq.client.*; /** * 路由队列-消息消费者 */ public class Recv01 { private final static String EXCHANGE_NAME = "exchange_direct"; public static void main(String[] argv) throws Exception { //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); //连接工厂创建连接 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); //绑定交换机 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //获取队列(排他队列) String queueName = channel.queueDeclare().getQueue(); //绑定队列和交换机 String errorRoutingKey="error"; channel.queueBind(queueName,EXCHANGE_NAME,errorRoutingKey); 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(queueName, true, deliverCallback, consumerTag -> { }); } }
3.创建第二个消费者Recv.java
第二个消费者可以获取三个消息(error、info、warning)
package com.ckfuture.direct.recv; import com.rabbitmq.client.*; /** * 路由队列-消息消费者 */ public class Recv02 { private final static String EXCHANGE_NAME = "exchange_direct"; public static void main(String[] argv) throws Exception { //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); //连接工厂创建连接 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); //绑定交换机 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //获取队列(排他队列) String queueName = channel.queueDeclare().getQueue(); //绑定队列和交换机 String infoRoutingKey="info"; String errorRoutingKey="error"; String warningRoutingKey="warning"; channel.queueBind(queueName,EXCHANGE_NAME,infoRoutingKey); channel.queueBind(queueName,EXCHANGE_NAME,errorRoutingKey); channel.queueBind(queueName,EXCHANGE_NAME,warningRoutingKey); 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(queueName, true, deliverCallback, consumerTag -> { }); } }
4.依次运行Recv01和Recv02程序
在管理控制台查看:
查看详情:
5.启动Send.java
Recv01只接收一条消息:
Recv02可以接收三条消息: