介绍消息队列RabbitMQ版客户端报QueueHasDiffField类型错误的原因和处理方法。

问题现象

使用消息队列RabbitMQ版客户端连接消息队列RabbitMQ版服务端时,报QueueHasDiffField类型错误。 例如QueueHasDiffField[OAutoDelete=false&NAutoDelete=true;] 。

说明 报错中O开头的参数的属性值为要调用的Queue的参数的已设置属性值,N开头的参数的属性值为本次声明的Queue的参数的属性值。

可能原因

要调用的Queue的参数的已设置属性值与本次声明的Queue的参数的属性值不一致,导致报QueueHasDiffField类型错误。可能出现不一致的Queue参数如下。

参数 类型 描述
queue String Queue的名称。
durable boolean Queue是否持久化:
  • true:持久化类型,在消息队列RabbitMQ版客户端重连消息队列RabbitMQ版服务端时被再次自动创建出来 。
  • false:非持久化类型,在消息队列RabbitMQ版客户端重连消息队列RabbitMQ版服务端时不会被再次自动创建出来 。
说明 调用CreateQueue或在消息队列RabbitMQ版控制台Queue管理页面创建的Queue默认为持久化Queue。
exclusive boolean Queue是否具有排他性:
  • true:排他性类型,只对首次声明其的Connection可见,且会在Connection断开时自动删除。
  • false:非排他性类型,对其他Connection可见,不会在Connection断开时自动删除。
autoDelete boolean Queue是否自动删除:
  • true:自动删除类型,在最后一个Consumer取消订阅后,自动删除。
  • false:非自动删除类型,即使最后一个Consumer取消订阅后,也不会自动删除。
arguments Map Queue的其他参数。包括死信Exchange、死信Routing Key和消息过期时间。

例如要调用的Queue的autoDelete参数的已设置属性值与本次声明的Queue的autoDelete参数的属性值不一致,导致报错QueueHasDiffField[OAutoDelete=false&NAutoDelete=true;]。

  • 要调用的Queue的autoDelete参数的已设置属性值为false。
    说明 您可以调用ListQueues或在消息队列RabbitMQ版控制台Queue管理页面获取要调用的Queue的参数的属性值。
  • 本次声明的Queue的autoDelete参数的属性值为true。

    示例代码如下:

    channel.queueDeclare("test", false, false, true, null);

解决方案

在代码中修改本次声明Queue的参数的属性值,使其与要调用的Queue的参数的已设置属性值保持一致。例如,在代码中将本次声明的Queue的autoDelete参数的属性值修改为false,使其与要调用的Queue的autoDelete参数的已设置属性值保持一致。
示例代码如下:
channel.queueDeclare("test", false, false, false, null);