Topics通配符模式
代码实现
生产者
需求: 所有error级别的信息存入数据库 所有order系统的日志存入数据库 所有日志都打印到控制台
package com.sx.producer;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发送消息
*/
public class Producer_Topics {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.3");
factory.setPort(5672);
factory.setVirtualHost("/sx");
factory.setUsername("sx");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String exchangeName = "test_topics";
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC, true, false, false, null);
String queue1 = "test_topics_queue1";
String queue2 = "test_topics_queue2";
channel.queueDeclare(queue1, true, false, false, null);
channel.queueDeclare(queue2, true, false, false, null);
//routing key 系统名.日志级别
channel.queueBind(queue1, exchangeName, "#.error");
channel.queueBind(queue1, exchangeName, "order.*");
channel.queueBind(queue2, exchangeName, "*.*");
String body = "log";
//发送消息
channel.basicPublish(exchangeName, "order.error", null, body.getBytes());
//释放资源
channel.close();
connection.close();
}
}
消费者C1
package com.sx.consumer;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer_TopicsC1 {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.3");
factory.setPort(5672);
factory.setVirtualHost("/sx");
factory.setUsername("sx");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body = " + new String(body));
System.out.println("信息已保存到数据库中!");
}
};
channel.basicConsume("test_topics_queue1", true, consumer);
}
}
消费者C2
package com.sx.consumer;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer_TopicsC2 {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.3");
factory.setPort(5672);
factory.setVirtualHost("/sx");
factory.setUsername("sx");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body = " + new String(body));
System.out.println("打印信息到控制台!");
}
};
channel.basicConsume("test_topics_queue2", true, consumer);
}
}
运行结果
Routing key 为 order.error
Routing key 为 order.info
Routing key 为 news.info