下面展示一些 内联代码片
。
public class Routing {
@Test
public void publish() throws IOException, TimeoutException {
//1. 获取连接对象
Connection getconnection = RabbitMQUtil.getconnection();
//2. 创建连接通道对象
Channel channel = getconnection.createChannel();
// Ps:exchange是不会帮你将消息持久化到本地的,Queue才会帮你持久化消息。
//3. 创建exchange - 绑定某一个队列
//参数1: 交换机的名称
//参数2: 路由模式 指定exchange的类型 FANOUT - pubsub , DIRECT - Routing , TOPIC - Topics
channel.exchangeDeclare("routing-exchange", BuiltinExchangeType.DIRECT);
//绑定多个队列 可以在这里 绑定队列 但是咱们是在消费者 创建临时队列 然后绑定
//channel.queueBind("routing-queue-error","routing-exchange","ERROR");
//channel.queueBind("routing-queue-info","routing-exchange","INFO");
//4. 发布消息到exchange,同时指定路由的规则 key 是 error info
channel.basicPublish("routing-exchange","ERROR",null,"ERROR".getBytes());
channel.basicPublish("routing-exchange","INFO",null,"INFO1".getBytes());
channel.basicPublish("routing-exchange","INFO",null,"INFO2".getBytes());
channel.basicPublish("routing-exchange","INFO",null,"INFO3".getBytes());
System.out.println("生产者发布消息成功");
//释放资源
channel.close();
getconnection.close();
}
@Test
public void consume() throws IOException, TimeoutException {
//1. 获取连接对象
Connection getconnection = RabbitMQUtil.getconnection();
//2. 创建channel
Channel channel = getconnection.createChannel();
//3. 声明 交换机
channel.exchangeDeclare("routing-exchange",BuiltinExchangeType.DIRECT);
// 这种方式 是 创建持久队列
//channel.queueDeclare("routing-queue-error",true,false,false,null);
//这种方式 是创建临时 队列
String queryname=channel.queueDeclare().getQueue();
//基于 路由key 绑定 队列 和 交换机
channel.queueBind(queryname,"routing-exchange","ERROR");
//1 指定当前消费者,一次消费多少个消息
channel.basicQos(1);
//4. 开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者1号接收到消息:" + new String(body,"UTF-8"));
//2. 手动ack
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
//参数1:queue - 指定消费哪个队列
//参数2:autoAck - 指定是否自动ACK (true,接收到消息后,会立即告诉RabbitMQ)
//参数3:consumer - 指定消费回调
//3. 指定手动ack
channel.basicConsume(queryname,false,consumer);
System.out.println("消费者开始监听队列!");
// System.in.read();
System.in.read();
//5. 释放资源
channel.close();
getconnection.close();
}
@Test
public void consume2() throws Exception {
//1. 获取连接对象
Connection connection = RabbitMQUtil.getconnection();
//2. 创建channel
Channel channel = connection.createChannel();
// 这种方式 是 创建持久队列
//channel.queueDeclare("routing-queue-info",true,false,false,null);
//3.声明交换机
channel.exchangeDeclare("routing-exchange",BuiltinExchangeType.DIRECT);
//这种方式 是创建临时 队列
String queueName = channel.queueDeclare().getQueue();
//基于 路由key 绑定 队列 和 交换机
channel.queueBind(queueName,"routing-exchange","ERROR"); //绑定路由Key 为ERROR 的
channel.queueBind(queueName,"routing-exchange","INFO"); // 绑定路由Key 为INFO 的
//1 指定当前消费者,一次消费多少个消息
channel.basicQos(1);
//4. 开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者2号接收到消息:" + new String(body,"UTF-8"));
//2. 手动ack
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
//参数1:queue - 指定消费哪个队列
//参数2:autoAck - 指定是否自动ACK (true,接收到消息后,会立即告诉RabbitMQ)
//参数3:consumer - 指定消费回调
//3. 指定手动ack
channel.basicConsume(queueName,false,consumer);
System.out.println("消费者开始监听队列!");
// System.in.read();
System.in.read();
//5. 释放资源
channel.close();
connection.close();
}
}