RabbitMQ通信方式之Routing
Routing通信方式结构图
![](https://i-blog.csdnimg.cn/blog_migrate/08cd712d759ba1db744240f4d30aa3a0.png)
Routing模式和PubSub模式的区别:
Routing模式又称为Direct模式,它是一种点对点的消息传输模式。在Routing模式中,生产者将消息发送到一个Exchange(交换机),Exchange会根据消息的Routing Key(路由键)来将消息转发到相应的队列中。消费者可以绑定到一个或多个队列,通过设置不同的Routing Key来接收不同的消息。
PubSub模式又称为发布订阅模式,它是一种广播式的消息传输模式。在PubSub模式中,消息发送到一个Exchange,并且Exchange会将消息广播给所有绑定到它上面的队列。
添加RabbitMQ和Junit工具栏的maven依赖
<!--rabbitmq-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
创建一个构建连接的工具类
public class RabbitMQConnectionUtil {
public static final String RABBITMQ_HOST = "xxx.xx.xxx.xxx"; //设置你自己的RabbitMQ服务ip
public static final int RABBITMQ_PORT = 5672;
public static final String RABBITMQ_USERNAME = "guest";
public static final String RABBITMQ_PASSWORD = "guest";
public static final String RABBITMQ_VIRTUAL_HOST = "/";
/**
* 构建RabbitMQ的连接对象
*/
public static Connection getConnection() throws Exception {
//1. 创建Connection工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置RabbitMQ的连接信息
factory.setHost(RABBITMQ_HOST);
factory.setPort(RABBITMQ_PORT);
factory.setUsername(RABBITMQ_USERNAME);
factory.setPassword(RABBITMQ_PASSWORD);
factory.setVirtualHost(RABBITMQ_VIRTUAL_HOST);
//3. 返回连接对象
Connection connection = factory.newConnection();
return connection;
}
创建生产者
public class Producer {
private static final String EXCHANGE_NAME = "routing-exchange";
public static final String QUEUE_NAME1 = "routing-one";
public static final String QUEUE_NAME2 = "routing-two";
@Test
public void pubSub() throws Exception {
//1.获取连接对象
Connection connection = RabbitMQConnectionUtil.getConnection();
//2.构建Channel
Channel channel = connection.createChannel();
//3.构建交换机 exchange类型为direct(路由模式)
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//4.构建队列
channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
//5.绑定交换机和队列,使用的是DIRECT类型的交换机
channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"ORANGE");
channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"BLACK");
channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"GREEN");
//6.发消息到交换机
channel.basicPublish(EXCHANGE_NAME,"ORANGE",null,"橙子!".getBytes());
channel.basicPublish(EXCHANGE_NAME,"BLACK",null,"黑葡萄!".getBytes());
//因为没有构建WHITE的路由规则,所以该消息不会路由到任何队列中
channel.basicPublish(EXCHANGE_NAME,"WHITE",null,"兔子!".getBytes());
System.out.println("消息成功发送!");
}
}
创建消费者
public class Consumer {
@Test
public void consume1() throws Exception {
//1.获取连接对象
Connection connection = RabbitMQConnectionUtil.getConnection();
//2.构建Channel
Channel channel = connection.createChannel();
//3.构建队列
channel.queueDeclare(Producer.QUEUE_NAME1,false,false,false,null);
//4.监听消息
DefaultConsumer callback = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者获取到消息:" + new String(body,"UTF-8"));
}
};
channel.basicConsume(Producer.QUEUE_NAME1,true,callback);
System.out.println("消费者开始监听队列");
System.in.read();
}
}
启动生产者和消费者后,可以看到消费者的日志打印,成功消费到routing-one队列中的消息:“橙子!”
![](https://i-blog.csdnimg.cn/blog_migrate/767df63a8d347ae8ce0324527a0971be.png)