RabbitMQ知识点整理5-声明交换器和队列
交换器和队列, 在应用程序使用它们的之前就已经存在了, 所以在使用之前要先声明它们
package demo.java.web.amqp.rabbitmq.demo2; import java.io.IOException; import java.util.concurrent.TimeoutException; import org.junit.Before; import org.junit.Test; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * 声明交换器和队列 * * @author jiangkd * @date 2020/10/12 */ public class DeclareExchangeAndQueueDemo { private Channel channel = null; final private String IP_ADDRESS = "127.0.0.1"; final private int PORT = 5672; final private String USERNAME = "root"; final private String PASSWORD = "root123"; final private String VIRTUALHOST = "/jiangkd"; final private String EXCHANGE_NAME = "exchange_demo";
final private String QUEUE_NAME = "queue_demo"; final private String ROUTING_KEY = "routingKey_demo"; @Before public void before() throws IOException, TimeoutException { // ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(IP_ADDRESS); connectionFactory.setPort(PORT); connectionFactory.setVirtualHost(VIRTUALHOST); connectionFactory.setUsername(USERNAME); connectionFactory.setPassword(PASSWORD); // 创建连接 Connection connection = connectionFactory.newConnection(); // 创建信道 channel = connection.createChannel(); } /** * 声明一个交换器和队列, 这里的交换器和队列没有设置特殊参数 * * @throws IOException */ @Test public void declareExchangeAndQueue() throws IOException { // 创建一个持久化的, 非自动删除的, 绑定类型是direct的交换器 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true); // 创建一个非持久化的, 排他的, 自动删除的队列(此队列的名称是由rabbitmq自动生成的) String queueName = channel.queueDeclare().getQueue(); // 使用绑定键(路由键)将交换机和队列绑定起来 channel.queueBind(queueName, EXCHANGE_NAME, ROUTING_KEY); } }
上面代码中声明的队列具备如下特性: 只对当前应用中同一个Connection层面可用, 同一个Connection的不同Channel可共用, 并且也会在应用连接断开时自动删除
如果要在应用中共享一个队列, 可以如下声明队列:
/** * 应用中共享一个队列 * @throws IOException */ @Test public void declareExchangeAndQueue2() throws IOException { // channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true); channel.queueDeclare(QUEUE_NAME, true, false, false, null); channel.queueBind(EXCHANGE_NAME, QUEUE_NAME, ROUTING_KEY); }
这里的队列被声明为持久化的、非排他的、非自动删除的,而且也被分配另一个确定的已知的名称(由客户端分配而非RabbitMQ自动生成)
注意: Channel的API方法都是可以重载的, 比如exchangeDeclare, queueDeclare, 根据参数不同, 可以有不同的重载形式, 根据自身的需要进行调用
生产者和消费者都可以声明一个交换机或者队列, 如果尝试声明一个已经存在的交换器或者队列, 只要声明的参数完全匹配现存的交换器或者队列, RabbitMQ就可以什么都不做, 并成功返回, 如果声明的参数不匹配则会抛出异常。
分类:
RabbitMQ教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)