5种队列模式:
从第三种开始 消息发布 - 订阅模式 ,路由模式, 主题模式 。
这几种关注的重点是 生产者发布的消息 会被放到哪个队列中。 定义的交换机分别为
订阅模式 : fanout 将消息分散开 。
解读:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费
路由模式 : direct 按照routingkey 直接匹配发送消息到队列 。
解读: 在订阅模式上加入了,routingkey,需要根据匹配的key将消息发送到对应的队列。
可以通过 不设置 routingkey 达到 订阅模式的效果,对routingkey是直接匹配的。
比如:发送的消息 routingkey 为 delete ,队列1 和 队列2 都会收到消息。
主题模式 : topic 可以有通配符,发送到匹配的队列中。
解读 :支持 routingkey 使用通配符进行模糊匹配。
比如下方中 ,routingkey 为 a.b 的将会放到 队列 2中,key为 delete 没有通配符的将会直接匹配(感觉和路由模式的差不多)。
代码实验:
导入rabbit客户端依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
连接工具类 :
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class ConnectionUtil {
public static Connection getConnection() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("xx.xxx.xxx.xxx");
//端口
factory.setPort(5672);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("my_vhost");
factory.setUsername("admin");
factory.setPassword("admin");
// 通过工程获取连接
Connection connection = factory.newConnection();
return connection;
}
}
只针对后面几种模式,通用的例子,需要自己改交换机名称和类型 。生产者类:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
public class MySendRouting {
// 交换机名称
private final static String EXCHANGE_NAME = "test_exchange_topic";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 声明exchange 并设置 类型
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
// 消息内容
String message = "Hello World!";
// 发送消息到 指定交换机 , routingkey 为 delete
channel.basicPublish(EXCHANGE_NAME, "delete", null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
新建队列,绑定到交换机
发送消息之后登陆rabbit的web管理页面查看 对应队列的消息数。
参考链接: https://blog.csdn.net/hellozpc/article/details/81436980