- RabbitMQ教程4:选择性接收消息
- 代码基础: 易学笔记-RabbitMQ教程3:一个消息发给所有消费者(路由器类型为:fanout)
- 交换器(路由器):
- Exchange 选择 “direct”,而不是“fanout”
- channel.basicPublish(EXCHANGE_NAME,severity,第二个参数 severity 为关键字
- 临时队列
- channel.queueBind(queueName, EXCHANGE_NAME, severity); 第二个参数 severity 为关键字,该关键字和交换器的关键字一致时才会被加入队列
- 一个队列可以绑定一个交换器的多个关键字
- 新建生产者:
package oneProductAllConsume; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class EmitLogDirect { private static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] argv) throws Exception { //创建连接 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.65.129"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //声明路由器和路由器的类型 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); String severity = "warning"; String message = ".........i am msg........."; //发布消息 channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + severity + "':'" + message + "'"); channel.close(); connection.close(); } }
- 发布消息绑定关键字
String message = ".........i am msg.........";
String severity = "warning";
//发布消息
channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));
- 发布消息绑定关键字
- 新建消费者:
package oneProductAllConsume; import com.rabbitmq.client.*; import java.io.IOException; public class ReceiveLogsDirect { private static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] argv) throws Exception { //建立连接和通道 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.65.129"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //声明路由器和类型 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //声明队列 String queueName = channel.queueDeclare().getQueue(); //定义要监听的级别 String[] severities = {"info", "warning", "error"}; //根据绑定键绑定 for (String severity : severities) { channel.queueBind(queueName, EXCHANGE_NAME, severity); } System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); 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(" [x] Received '" + envelope.getRoutingKey() + "':'" + message + "'"); } }; channel.basicConsume(queueName, true, consumer); } }
- 队列、交换器和关键字绑定
//定义要监听的级别
String[] severities = {"info", "warning", "error"};
//根据绑定键绑定
for (String severity : severities) {
channel.queueBind(queueName, EXCHANGE_NAME, severity);
}
- 队列、交换器和关键字绑定
- 测试
- 发布者发布 info类型消息
[x] Sent 'info':'.........i am msg.........'
- 接受者接收info类型消息
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'info':'.........i am msg.........'
- 发布者发布warn类型消息
[x] Sent 'warn':'.........i am msg.........'
- 接受者由于只接收这三种消息:info、warning、error,不包含:warn,所以没有接收
- 发布者发布 info类型消息