RabbitMQ入门教程(六):演示交换机的直连类型,一个交换机绑定多个路由键,一个队列绑定多个路由键

本文演示了如何使用RabbitMQ的直连交换机类型,通过绑定多个路由键到同一队列,实现消息的精确投递。生产者随机发送消息至不同路由键,而两个消费者则分别监听特定的路由键,确保消息被正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

本节主要演示使用直连接类型,将多个路由键绑定到同一个队列上。

è¿éåå¾çæè¿°

生产者

	@Test
	public void produce() throws IOException, TimeoutException {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		factory.setPort(AMQP.PROTOCOL.PORT);
		factory.setUsername("guest");
		factory.setPassword("guest");
		
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();
		
		// 交换机名
		String EXCHANGE_NAME = "exchange.direct.routing";
		// 路由键名数组
		String[] routings = {"debug", "info", "warning", "error"};
		// 循环将一个交换机绑定多个路由键
		for (int i = 0; i < 20; i++) {
			int random = new Random().nextInt(4);
			String routingKey = routings[random];
			String message = "Hello RabbitMQ---" + routingKey + "-----" + i;
			channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());
		}
		
		channel.close();
		conn.close();
	}

消费者1

	@Test
	public void consume1() throws IOException, TimeoutException, InterruptedException {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		factory.setPort(AMQP.PROTOCOL.PORT);
		factory.setUsername("guest");
		factory.setPassword("guest");
		
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();
		
		// 交换机名
		String EXCHANGE_NAME = "exchange.direct.routing";
		// 声明一个交换机,使用直连类型
		channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
		
		// 生成一个随机的队列名
		String QUEUE_NAME = channel.queueDeclare().getQueue();
		// 将一个队列绑定多个路由键
		String[] routingKeys = {"debug", "info"};
		for (int i = 0; i < routingKeys.length; i++) {
			channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
		}
		
		 System.out.println("Consumer1 Wating Receive Message");
		 
		 Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				String message = new String(body, "UTF-8");
				System.out.println("[C] received " + message + ",处理业务中...");
			}
		 };
		 
		 channel.basicConsume(QUEUE_NAME, true, consumer);
		 Thread.sleep(1000000);
	}

消费者2

	@Test
	public void consume2() throws IOException, TimeoutException, InterruptedException {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		factory.setPort(AMQP.PROTOCOL.PORT);
		factory.setUsername("guest");
		factory.setPassword("guest");
		
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();
		
		// 交换机名
		String EXCHANGE_NAME = "exchange.direct.routing";
		// 声明一个交换机,使用直连类型
		channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
		
		// 生成一个随机的队列名
		String QUEUE_NAME = channel.queueDeclare().getQueue();
		// 将一个队列绑定多个路由键
		String[] routingKeys = {"debug", "info"};
		for (int i = 0; i < routingKeys.length; i++) {
			channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
		}
		
		 System.out.println("Consumer2 Wating Receive Message");
		 
		 Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				String message = new String(body, "UTF-8");
				System.out.println("[C] received " + message + ",处理业务中...");
			}
		 };
		 
		 channel.basicConsume(QUEUE_NAME, true, consumer);
		 Thread.sleep(1000000);
	}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值