一、Routing 路由模式
路由模式:
- 队列与交换机的绑定,要定一个RoutoingKey
- 生产者向交换机发送消息的时候,也必须指定消息的路由RoutoingKey
- 交换机根据消息的RoutoingKey进行判断,只有队列的RoutoingKey与消息的RoutoingKey完全一致时,队列才会收到消息。
二、示例
基础代码及工具类全都在第一篇中,需要请查看《RabbitMQ工作模式(一)》
1、生产者代码
packagecom.cui.producer; importcom.cui.common.RabbitMqUtils; importcom.rabbitmq.client.BuiltinExchangeType; importcom.rabbitmq.client.Channel; importcom.rabbitmq.client.Connection; importjava.io.IOException; /*** 代码和订阅模式差不多,但是模式需要改成direct,队列需要指定RoutingKey,发消息也需要指定RoutingKey*/publicclassProducer_Routing { publicstaticvoidmain(String[] args) throwsIOException { //获得连接Connectionconnection=RabbitMqUtils.getConnection(); //创建channelChannelchannel=connection.createChannel(); //创建交换机/*** exchange:交换机名称* type:交换机类型* DIRECT("direct"),定向* FANOUT("fanout"),广播* TOPIC("topic"),通配符* HEADERS("headers");参数匹配* durable:是否持久化* autoDelete:是否自动删除* internal:内部使用。一般是false* arguments:参数* exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)*/Stringexchange="test_direct_exchange"; channel.exchangeDeclare(exchange, BuiltinExchangeType.DIRECT, true, false, false, null); //创建队列StringqueueName1="test_direct_queue1"; StringqueueName2="test_direct_queue2"; channel.queueDeclare(queueName1, true, false, false, null); channel.queueDeclare(queueName2, true, false, false, null); //队列1绑定交换机 errorchannel.queueBind(queueName1, exchange, "error"); //队列2绑定交换机 info error warningchannel.queueBind(queueName2, exchange, "info"); channel.queueBind(queueName2, exchange, "error"); channel.queueBind(queueName2, exchange, "warning"); //发送消息Stringmessage="日志信息:这是一条路由消息 | 日志级别:info"; channel.basicPublish(exchange, "info", null, message.getBytes()); //释放资源RabbitMqUtils.close(channel, connection); } }
2、消费者代码
路由模式消费者的代码和PubSub的消费者代码差不多,只是需要将交换机的类型改为direct模式即可测试。上述生产者的消息只会发送到info的路由,即queueName2,queueName1的RoutingKey为error,所以接收不到对应的消息。