目录
概述
上篇direct必须是生产者发布消息指定的routingKey和消费者在队列绑定时指定的routingKey完全相等时才能匹配到队列上。topic与direct不同,可以进行模糊匹配。topic交换机的消息不能随意的设置选择routingKey,必须是由点隔开的一系列的标识符组成。标识符可以是任何东西,但是一般都与消息的某些特性相关。例子:“link.orange.rabbit”,你可以定义任何数量的标识符,上限为255个字节
匹配规则:
* 其中星号可以代替一个单词
# 可以替代零个或更多的单词,只要能模糊匹配上就能将消息映射到队列中。当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息
注:队列1 将接受warn相关的消息
队列2 将接受info 相关消息 debugger所有消息
代码
生产者
package com.ll.mq.hellomq.topic;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
*
* @author ll 生产者
*
*/
public class Producer {
public static void main(String[] args) {
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("kysc");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// Routing 的路由规则使用直连接
String EXCHANGE_NAME = "exchange.topic";
String[] routingKeys = { "link.warn.rabbit", "link.warn.elephant", "debugger.info"};
for (String routingKey : routingKeys) {
String message = "Hello RabbitMQ - " + routingKey;
System.out.println(message);
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));
}
// 关闭资源
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
消费者1
package com.ll.mq.hellomq.topic;
import java.io.IOException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
*
* @author ll 消费者1
*
*/
public class ConsumerOne {
static String EXCHANGE_NAME = "exchange.topic";
static String QUEUE_NAME = "queue.topic.q1";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("kysc");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 声明交换机类型
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String[] routingKeys = {"*.warn.*"};
for (int i = 0; i < routingKeys.length; i++) {
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
}
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [C] ConsumerOne '" + message + "', 接受...");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
消费者2
package com.ll.mq.hellomq.topic;
import java.io.IOException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
*
* @author ll 消费者2
*
*/
public class ConsumerTwo {
static String EXCHANGE_NAME = "exchange.topic";
static String QUEUE_NAME = "queue.topic.q2";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("kysc");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 声明交换机类型
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String[] routingKeys = {"debugger.#"};
for (int i = 0; i < routingKeys.length; i++) {
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
}
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [C] ConsumerTwo '" + message + "', 接受中...");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
结果
生产者:Hello RabbitMQ - link.warn.rabbit
Hello RabbitMQ - link.warn.elephant
Hello RabbitMQ - debugger.info
消费者1 [C] ConsumerOne 'Hello RabbitMQ - link.warn.rabbit', 接受...
[C] ConsumerOne 'Hello RabbitMQ - link.warn.elephant', 接受...
消费者2 [C] ConsumerTwo 'Hello RabbitMQ - debugger.info', 接受中...
下一篇 https://blog.csdn.net/lilongwangyamin/article/details/105118955 rabbitmq rpc远程过程调用