RabbitMQ知识点整理6-exchangeDeclare方法详解

exchangeDeclare 有多个重载方法,这些重载方法都是由下面这个方法中缺省的某些参数构成的。

Exchange.DeclareOk exchangeDeclare(String exchange,
                                              String type,
                                              boolean durable,
                                              boolean autoDelete,
                                              boolean internal,
                                              Map<String, Object> arguments) throws IOException;

方法的返回值是Exchange.DeclareOK, 用来标识成功声明了一个交换器。

各个参数详细说明如下:

exchange: 交换器的名称

type: 交换器的类型, 常见类型有fanout, direct, topic, headers

durable: 设置是否持久化, true表示持久化, 反之是非持久化, 持久化可以将交换器存盘, 在服务器重启的时候不会丢失相关信息

autoDelete: 设置是否自动删除, true表示自动删除, 自动删除的前提是至少有一个队列或者交换器与这个交换器绑定, 之后所有与这个交换器绑定的队列或交换器都于此解绑, 注意不能错误的把这个参数理解为"当与此交换器连接的客户端都断开时, RabbitMQ会自动删除本交换器"

internal: 设置是否内置的, true表示是内置的交换器, 客户端程序无法直接发送消息到这个交换器中, 只能通过交换器路由到交换器这个方式

arguments: 其他一些结构化参数, 比如alternate-exchange

exchangeDeclare的其他重载方法如下:

1.Exchange.DeclareOk exchangeDeclare(String exchange, String type) throws IOException;
2.Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable) throws IOException;
3.Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
                                       Map<String, Object> arguments) throws IOException;
与此对应的, 将第二个参数String type换成BuiltinExchangeType type对应的几个重载方法如下:
1.Exchange.DeclareOk exchangeDeclare(String exchange, BuiltinExchangeType type) throws IOException;
2.Exchange.DeclareOk exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable) throws IOException;
3.Exchange.DeclareOk exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable) throws IOException;
4.Exchange.DeclareOk exchangeDeclare(String exchange,
        BuiltinExchangeType type,
        boolean durable,
        boolean autoDelete,
        boolean internal,
        Map<String, Object> arguments) throws IOException;

 与exchangeDeclare方法师出同门的还有几个方法, 比如exchangeDeclareNoWait方法, 具体定义如下(当然也有BuiltExchangeType版本的, 这里就不展开了):

void exchangeDeclareNoWait(String exchange,
                               String type,
                               boolean durable,
                               boolean autoDelete,
                               boolean internal,
                               Map<String, Object> arguments) throws IOException;

此方法比exchangeDeclare方法多设置了一个nowait参数, 这个nowait参数指的是AMQP中Exchange.Declare命令的参数, 意思是不需要服务器返回, 注意这个方法的返回是void, 而exchangeDeclare方法的返回时Exchange.DeclareOK, 意思是在客户端声明了一个交换器之后, 需要等待服务器的返回(服务器会返回Exchange.Declare-ok这个AMQP命令)

针对"exchangeDeclareNoWait 不需要服务器任何返回值"这一点, 考虑这样一种情况,在声明完一个交换器之后(实际服务器还并未完成交换器的创建) , 那么此时客户端紧接着使用这个交换器,必然会发生异常。如果没有特殊的缘由和应用场景,并不建议使用这个方法。

这里还有师出同门的另一个方法exchangeDeclarePassive ,这个方法的定义如下:

Exchange.DeclareOk exchangeDeclarePassive(String name) throws IOException;

这个方法在实际应用过程中还是非常有用的,它主要用来检测相应的交换器是否存在。如果存在则正常返回:如果不存在则抛出异常: 404 channel exception ,同时Channel 也会被关闭。

有声明创建交换器的方法,当然也有删除交换器的方法。相应的方法如下:

1.Exchange.DeleteOk exchangeDelete(String exchange, boolean ifUnused) throws IOException;
2.void exchangeDeleteNoWait(String exchange, boolean ifUnused) throws IOException;
3.Exchange.DeleteOk exchangeDelete(String exchange) throws IOException;

其中exchange表示交换器的名称, 而ifUnused用来设置是否在交换器没有使用的情况下删除, 如果设置true表示只有在此交换器没有被使用的情况下才会被删除, false表示无论如何这个交换器都要被删除