阿里云首页 消息队列RabbitMQ版

消息队列AMQP版客户端报“ExchangeHasDiffFields”类型错误

问题描述

使用消息队列AMQP版时遇到ExchangeHasDiffFields类型错误,可能引发此错误的步骤如下:

  1. 本地客户端声明了Exchange的属性,示例代码如下。
    channel.exchangeDeclare("test", "direct", false, false, false, null);
    说明:此处第3个属性false指durable参数的值。
  2. 通过客户端连接服务端。
  3. 系统提示ExchangeHasDiffFields类型错误。此类型错误对应多种详细报错,此处列举其中一种报错。
    ExchangeHasDiffFields[ODurable=true&NDurable=false;]
    说明
    • 报错中以O开头的参数指目标Exchange已设置的属性。
    • 报错中以N开头的参数指本地声明Exchange的属性。

上述示例中的错误表示,目标Exchange已设置的属性(durable=true)与本地声明Exchange的属性(durable=false)不同。

问题原因

本地声明中Exchange的属性与要调用的目标Exchange属性不同,产生ExchangeHasDiffFields类型错误。如果您想了解哪些Exchange参数值不一致时可能导致ExchangeHasDiffFields类型错误,请参见更多信息

解决方案

请参考如下步骤进行处理:

  1. 记录本地声明中Exchange的参数值。
  2. 通过ListExchanges API消息队列AMQP版控制台Exchange管理页面,获取目标Exchange的属性。确认目标Exchange的属性与本地声明中的属性存在差异。
  3. 修改本地声明中Exchange的参数值,使其与要调用的目标Exchange属性保持一致。此处继续以上述错误为例:
    • 修改前,本地声明中Exchange的durable参数值为false
      channel.exchangeDeclare("test", "direct", false, false, false, null);
    • 修改后,本地声明中Exchange的durable参数值为true
      channel.exchangeDeclare("test", "direct", true, false, false, null);
  4. 重新通过客户端连接服务端,确认报错已经消除。

更多信息

可能出现不一致的Exchange参数如下表。

参数 类型 描述
exchange String Exchange的名称
type String Exchange的类型,取值如下:
  • fanout
    该类型路由规则非常简单,会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,相当于广播功能。
  • direct
    该类型路由规则会将消息路由到Binding Key与Routing Key完全匹配的Queue中。
  • topic
    该类型与direct类型相似,只是规则没有那么严格,可以模糊匹配和多条件匹配,即该类型Exchange使用Routing Key模式匹配和字符串比较的方式将消息路由至绑定的Queue。
durable boolean Exchange是否持久化:
  • true
    持久化类型,在消息队列AMQP版客户端重连服务端时被再次自动创建出来。
  • false
    非持久化类型,在消息队列AMQP版客户端重连服务端时不会被再次自动创建出来。

说明:通过CreateExchange API或在消息队列AMQP版控制台创建的Exchange默认为持久化Exchange。

autoDelete boolean Exchange是否自动删除:
  • true
    自动删除,在最后一个Consumer取消订阅后,自动删除。
  • false
    非自动删除,即使最后一个Consumer取消订阅,也不会自动删除。

说明:通过CreateExchange API或在消息队列AMQP版控制台创建的Exchange默认为非自动删除类型。

internal boolean Exchange是否为Internal(内建)类型。默认值为false。取值:
  • true
    内建类型,用于Exchange和Exchange之间的绑定。
  • false
    非内建类型,用于Exchange和Queue之间的绑定。
arguments Map Exchange其他参数。包括Alternate Exchange。

适用于

  • 消息队列AMQP版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。

首页 消息队列RabbitMQ版 常见问题 消息队列AMQP版客户端报“ExchangeHasDiffFields”类型错误