阅读1038 返回首页    go 阿里云 go 技术社区[云栖]


状态不一致___异常类别_产品使用问题_消息队列 MQ-阿里云

1. 消息不合法

可能产生的原因

一般是消息属性、消息内容不合法,不合法的情况有:

  • 消息为空
  • 消息内容为空
  • 消息内容长度为0
  • 消息内容超过限定长度

建议解决方案

请确保消息没有以上的不合法情况,并根据异常提示进行解决。

2. 参数不合法

可能产生的原因

参数不合法的情况有以下几种:

嵌套的异常说明 异常描述
consumeThreadMin Out of range [1, 1000] 消费端线程数设置不合理
consumeThreadMax Out of range [1, 1000] 消费端线程数设置不合理
messageListener is null 未设置messageListener
consumerGroup is null 未设置Consumer ID
msg delay time more than 40 day 定时消息延时不能超过40天

建议解决方案

按照如下步骤操作:

  1. 按照异常提示修改客户端对应参数的配置,确保其在合理范围内;
  2. 重启应用。

3. 客户端状态异常

可能产生的原因

  1. 创建 Consumer、Producer 之后未显示调用 start() 方法来启动客户端;
  2. 创建 Consumer、Producer 之后 start() 过程有异常导致客户端启动失败;
  3. 创建 Consumer、Producer 并成功调用 start() 方法后,显示调用了 shutdown() 方法关闭了客户端;

建议解决方案

按如下步骤操作:

  1. 确保创建 Consumer、Producer 之后调用 start() 保证客户端处于启动状态;
  2. 查看 ons.log 判断在客户端在启动过程中是否有异常。

4. 订阅关系不一致

问题描述

在不同的 JVM 中启动了多个 Consumer,并且给相同的 Consumer ID 配置了不同的 Topic,或者是相同的 Topic 但 Tag 不同,最终导致订阅关系不一致,消息不符合预期。

错误代码示例

错误示例一:同一个订阅组(CID-MQ-FAQ)订阅的 Topic 不同(分别是 MQ-FAQ-TOPIC-1、MQ-FAQ-TOPIC-2)。

JVM-1上的代码:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID-MQ-FAQ");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("MQ-FAQ-TOPIC-1", "NM-MQ-FAQ", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println("Receive: " + message);
  7. return Action.CommitMessage;
  8. }
  9. });
  10. consumer.start();

JVM-2上的代码

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID-MQ-FAQ");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("MQ-FAQ-TOPIC-2", "NM-MQ-FAQ", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println("Receive: " + message);
  7. return Action.CommitMessage;
  8. }
  9. });
  10. consumer.start();

错误示例二:同一订阅组(CID-MQ-FAQ)订阅的 Topic 相同,但 Tag 不同(分别NM-MQ-FAQ-1、NM-MQ-FAQ-2)。

JVM-1上的代码:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID-MQ-FAQ");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("MQ-FAQ-TOPIC-1", "NM-MQ-FAQ-1", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println("Receive: " + message);
  7. return Action.CommitMessage;
  8. }
  9. });
  10. consumer.start();

JVM-2上的代码:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID-MQ-FAQ");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("MQ-FAQ-TOPIC-1", "NM-MQ-FAQ-2", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println("Receive: " + message);
  7. return Action.CommitMessage;
  8. }
  9. });
  10. consumer.start();

建议解决方案

请确保在不同 JVM 中使用相同的 Consumer ID 启动多个 Consumer 时,配置的 Topic 和 Tag 是一致的。

最后更新:2016-08-05 10:41:28

  上一篇:go 资源不存在___异常类别_产品使用问题_消息队列 MQ-阿里云
  下一篇:go TXC for MQ 快速入门__TXC for MQ_消息队列 MQ-阿里云