一、Direct exchange(直连交换机)
当交换机类型为direct类型时,根据队列绑定的路由建转发到具体的队列中存放消息
1.Producer
1 package com.miaoshaProject.mq.exchange.demo_direct; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.Channel; 5 import com.rabbitmq.client.Connection; 6 7 import java.io.IOException; 8 import java.util.concurrent.TimeoutException; 9 10 /** 11 * @Author wangshuo 12 * @Date 2022/5/7, 14:05 13 * Please add a comment 14 */ 15 public class Producer { 16 17 private static final String EXCHANGE_NAME = "direct_exchange"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 21 Connection connection = RabbitMQConnection.getConnection(); 22 Channel channel = connection.createChannel(); 23 //绑定交换机 24 channel.exchangeDeclare(EXCHANGE_NAME, "direct", true); 25 String msg = "测试direct交换机"; 26 //指定key发送消息 27 channel.basicPublish(EXCHANGE_NAME, "sms", null, msg.getBytes()); 28 channel.close(); 29 connection.close(); 30 } 31 }
2.ConsumerC
1 package com.miaoshaProject.mq.exchange.demo_direct; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 14:08 12 * Please add a comment 13 */ 14 public class ConsumerC { 15 16 private static final String EXCHANGE_NAME = "direct_exchange"; 17 private static final String A_QUEUE_NAME = "queueC"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 Connection connection = RabbitMQConnection.getConnection(); 21 Channel channel = connection.createChannel(); 22 //关联交换机、队列、路由key 23 channel.queueBind(A_QUEUE_NAME, EXCHANGE_NAME, "email"); 24 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 25 26 //重写收到消息后的动作 27 @Override 28 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 29 30 String msg = new String(body, "UTF-8"); 31 System.out.println("消费者C收到消息: " + msg); 32 } 33 }; 34 channel.basicConsume(A_QUEUE_NAME, true, defaultConsumer); 35 } 36 }
3.ConsumerD
1 package com.miaoshaProject.mq.exchange.demo_direct; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 14:08 12 * Please add a comment 13 */ 14 public class ConsumerD { 15 16 private static final String EXCHANGE_NAME = "direct_exchange"; 17 private static final String B_QUEUE_NAME = "queueD"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 Connection connection = RabbitMQConnection.getConnection(); 21 Channel channel = connection.createChannel(); 22 //关联交换机、队列、路由key 23 channel.queueBind(B_QUEUE_NAME, EXCHANGE_NAME, "sms"); 24 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 25 26 //重写收到消息后的动作 27 @Override 28 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 29 30 String msg = new String(body, "UTF-8"); 31 System.out.println("消费者D收到消息: " + msg); 32 } 33 }; 34 channel.basicConsume(B_QUEUE_NAME, true, defaultConsumer); 35 } 36 }
二、Fanout exchange(扇型交换机)
生产者发送一条消息,经过交换机转发到多个不同的队列,多个不同的队列就多个不同的消费者。
1.Producer
1 package com.miaoshaProject.mq.exchange.demo_fanout; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.Channel; 5 import com.rabbitmq.client.Connection; 6 7 import java.io.IOException; 8 import java.util.concurrent.TimeoutException; 9 10 /** 11 * @Author wangshuo 12 * @Date 2022/5/7, 13:23 13 * Please add a comment 14 */ 15 public class Producer { 16 17 private static final String EXCHANGE_NAME = "fanout_exchange"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 Connection connection = RabbitMQConnection.getConnection(); 21 Channel channel = connection.createChannel(); 22 //通道关联交换机 23 channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true); 24 String msg = "测试fanout交换机"; 25 channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes()); 26 channel.close(); 27 connection.close(); 28 } 29 }
2.ConsumerA
1 package com.miaoshaProject.mq.exchange.demo_fanout; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 13:36 12 * Please add a comment 13 */ 14 public class ConsumerA { 15 16 private static final String EXCHANGE_NAME = "fanout_exchange"; 17 private static final String A_QUEUE_NAME = "queueA"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 21 Connection connection = RabbitMQConnection.getConnection(); 22 Channel channel = connection.createChannel(); 23 //关联交换机与队列 24 channel.queueBind(A_QUEUE_NAME, EXCHANGE_NAME, ""); 25 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 26 //重写收到消息后的动作 27 @Override 28 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 29 String msg = new String(body, "UTF-8"); 30 System.out.println("消费者A收到消息: " + msg); 31 } 32 }; 33 //绑定队列,监听消息并自动删除已收到的消息 34 channel.basicConsume(A_QUEUE_NAME, true, defaultConsumer); 35 } 36 }
3.ConsumerB
1 package com.miaoshaProject.mq.exchange.demo_fanout; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 13:44 12 * Please add a comment 13 */ 14 public class ConsumerB { 15 16 private static final String EXCHANGE_NAME = "fanout_exchange"; 17 private static final String B_QUEUE_NAME = "queueB"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 21 Connection connection = RabbitMQConnection.getConnection(); 22 Channel channel = connection.createChannel(); 23 //关联交换机与队列 24 channel.queueBind(B_QUEUE_NAME, EXCHANGE_NAME, ""); 25 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 26 27 //重写收到消息后的动作 28 @Override 29 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 30 String msg = new String(body, "UTF-8"); 31 System.out.println("消费者B收到消息: " + msg); 32 } 33 }; 34 channel.basicConsume(B_QUEUE_NAME, true, defaultConsumer); 35 } 36 }
三、Topic exchange(主题交换机)
· 当交换机类型为topic类型时,根据队列绑定的路由建模糊转发到具体的队列中存放。
# 号表示支持匹配多个词; * 号表示只能匹配一个词
1.Producer
1 package com.miaoshaProject.mq.exchange.demo_topic; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.Channel; 5 import com.rabbitmq.client.Connection; 6 7 import java.io.IOException; 8 import java.util.concurrent.TimeoutException; 9 10 /** 11 * @Author wangshuo 12 * @Date 2022/5/7, 13:23 13 * Please add a comment 14 */ 15 public class Producer { 16 17 private static final String EXCHANGE_NAME = "topic_exchange"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 Connection connection = RabbitMQConnection.getConnection(); 21 Channel channel = connection.createChannel(); 22 //通道关联交换机 23 channel.exchangeDeclare(EXCHANGE_NAME, "topic", true); 24 String msg = "测试topic交换机"; 25 //设置topic 26 // topic匹配规则: #支持匹配多个词 、 *只能匹配一个词 27 channel.basicPublish(EXCHANGE_NAME, "wang.shuo.topic", null, msg.getBytes()); 28 channel.close(); 29 connection.close(); 30 } 31 }
2.ConsumerE
1 package com.miaoshaProject.mq.exchange.demo_topic; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 13:36 12 * Please add a comment 13 */ 14 public class ConsumerE { 15 16 private static final String EXCHANGE_NAME = "topic_exchange"; 17 private static final String E_QUEUE_NAME = "queueE"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 21 Connection connection = RabbitMQConnection.getConnection(); 22 Channel channel = connection.createChannel(); 23 //关联交换机、队列、主题 24 // topic匹配规则: #支持匹配多个词 、 *只能匹配一个词 25 channel.queueBind(E_QUEUE_NAME, EXCHANGE_NAME, "wang.*"); 26 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 27 //重写收到消息后的动作 28 @Override 29 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 30 String msg = new String(body, "UTF-8"); 31 System.out.println("消费者E收到消息: " + msg); 32 } 33 }; 34 //绑定队列,监听消息并自动删除已收到的消息 35 channel.basicConsume(E_QUEUE_NAME, true, defaultConsumer); 36 } 37 }
3.ConsumerF
1 package com.miaoshaProject.mq.exchange.demo_topic; 2 3 import com.miaoshaProject.mq.util.RabbitMQConnection; 4 import com.rabbitmq.client.*; 5 6 import java.io.IOException; 7 import java.util.concurrent.TimeoutException; 8 9 /** 10 * @Author wangshuo 11 * @Date 2022/5/7, 13:44 12 * Please add a comment 13 */ 14 public class ConsumerF { 15 16 private static final String EXCHANGE_NAME = "topic_exchange"; 17 private static final String F_QUEUE_NAME = "queueF"; 18 19 public static void main(String[] args) throws IOException, TimeoutException { 20 21 Connection connection = RabbitMQConnection.getConnection(); 22 Channel channel = connection.createChannel(); 23 //关联交换机、队列、主题 24 // topic匹配规则: #支持匹配多个词 、 *只能匹配一个词 25 channel.queueBind(F_QUEUE_NAME, EXCHANGE_NAME, "wang.#"); 26 DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { 27 28 //重写收到消息后的动作 29 @Override 30 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 31 String msg = new String(body, "UTF-8"); 32 System.out.println("消费者F收到消息: " + msg); 33 } 34 }; 35 channel.basicConsume(F_QUEUE_NAME, true, defaultConsumer); 36 } 37 }
四、Headers exchange(头交换机)
headers交换机和direct交换机完全一致,目前几乎不用
本文来自博客园,作者:荣慕平,转载请注明原文链接:https://www.cnblogs.com/rongmuping/articles/16242700.html