Topic主题模式:采用动态匹配 加入通配符机制 *:1个字母 #:0个或多个
生产者:
package Topic;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitMqUtils;
import java.io.IOException;
public class Provider {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMqUtils.getConnection();//通过工具类获取连接
Channel channel = connection.createChannel();//获取通道
//1.交换机名 2.交换机类型
channel.exchangeDeclare("logs_Topic","topic");//创建交换机
String routingkey="info.update.insert";//建议用点隔开 路由key
channel.basicPublish("logs_Topic",routingkey,null,("发送的消息为topic的routing key为["+routingkey+"]").getBytes());
RabbitMqUtils.closeConnectionAndChannel(channel,connection);
}
}
消费者1:
package Topic;
import com.rabbitmq.client.*;
import utils.RabbitMqUtils;
import java.io.IOException;
public class Consumer {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("logs_Topic","topic");//可以再次声名队列,有就调用 没有才创建 相当于绑定
String queueName = channel.queueDeclare().getQueue();//声名临时队列
// channel.exchangeBind("logs",queueName,"fanout");//绑定队列
channel.queueBind(queueName,"logs_Topic","info.#");//1.队列名 2.交换机名 3.Routing key //加入了通配符机制 *:1个 #:0个或多个
channel.basicConsume(queueName,true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者1---"+new String(body));
}
});
}
}
消费者2:
package Topic;
import com.rabbitmq.client.*;
import utils.RabbitMqUtils;
import java.io.IOException;
public class Consumer1 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("logs_Topic","topic");//可以再次声名队列,有就调用 没有才创建 相当于绑定
String queueName = channel.queueDeclare().getQueue();//声名临时队列
// channel.exchangeBind("logs",queueName,"fanout");//绑定队列
channel.queueBind(queueName,"logs_Topic","info.*");//1.队列名 2.交换机名 3.Routing key //加入了通配符机制 *:1个 #:0个或多个
channel.basicConsume(queueName,true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者1---"+new String(body));
}
});
}
}
路由key规则指定一致的就能匹配到