路由连接
我们是在交换机和队列之间绑定一个路由,消费者就可以根据路由值来进行获取到不同的值
消费者1 我们需要声明不同的交换机类型direct,在就交换机绑定队列的时候添加上需要绑定的路由
package org.example.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("192.168.26.146");
factory.setUsername("aw");
factory.setPassword("aw");
factory.setPort(5672);
factory.setVirtualHost("/yeb");
//连接工厂 创建连接
Connection connection = factory.newConnection();
//连接通信通道
Channel channel = connection.createChannel();
//声明交换机
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//获取队列(给他队列)
String queueName = channel.queueDeclare().getQueue();
String infoRoutingKey="info";
//交换机绑定队列
channel.queueBind(queueName,EXCHANGE_NAME,infoRoutingKey);
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.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
//监听连接 队列名
channel.basicConsume(queueName, false, deliverCallback, consumerTag -> { });
}
}
消费者2
package org.example.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("192.168.26.146");
factory.setUsername("aw");
factory.setPassword("aw");
factory.setPort(5672);
factory.setVirtualHost("/yeb");
//连接工厂 创建连接
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.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
//监听连接 队列名
channel.basicConsume(queueName, false, deliverCallback, consumerTag -> { });
}
}
开启消费者
生产者 发送的时候不同的路由绑定不同信息
package org.example.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("192.168.26.146");
factory.setUsername("aw");
factory.setPassword("aw");
factory.setPort(5672);
factory.setVirtualHost("/yeb");
//使用这种方式可以进行自动关闭 连接工厂创建连接; 创建通信通道
try ( Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
//添加exchange 类型direct
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//消息
String infoMessage = "普通信息";
String errorMessage = "错误信息";
String warningMessage = "警告信息";
String infoRoutingKey="info";
String errorRoutingKey="error";
String warningRoutingKey="warning";
//发送消息 参数 交换机、队列名字、参数、消息的实体
channel.basicPublish(EXCHANGE_NAME, infoRoutingKey, null, infoMessage.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + infoMessage + "'");
channel.basicPublish(EXCHANGE_NAME, errorRoutingKey, null, errorMessage.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + errorMessage + "'");
channel.basicPublish(EXCHANGE_NAME, warningRoutingKey, null, warningMessage.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + warningMessage + "'");
}
}
}
消费者二只绑定了三个路由
消费者1绑定一个路由