解决mqtt连接报Connection lost (32109) - java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]错误问题

简介: 最近生产环境在向mqtt客户端发布数据时反复出现一会断开一会连接错误,捕获的异常是java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]。尝试各种方式都未找到问题的原因,最后在检查发送主题topic的时候发现所发送mqtt客户端的topic的结尾包含了换行符,最终才将问题得以解决。

1、出现问题现象:

c2a62330e1855b9b8aeda78a08ca189.jpg

2、解决办法:

  • 查找哪些发送主题topic和发送playload数据是否是utf-8编码

(1)验证字符串是否为utf-8编码的代码如下:

publicstaticbooleanvalidateUTF8String(Stringinput)  {
for (inti=0; i<input.length(); i++) {
booleanisBad=false;
charc=input.charAt(i);
/* Check for mismatched surrogates */if (Character.isHighSurrogate(c)) {
if (++i==input.length()) {
isBad=true; /* Trailing high surrogate */                } else {
charc2=input.charAt(i);
if (Character.isLowSurrogate(c2)) {
isBad=true; /* No low surrogate */                    } else {
intch= ((((int) c) &0x3ff) <<10) | (c2&0x3ff);
if ((ch&0xffff) ==0xffff|| (ch&0xffff) ==0xfffe) {
isBad=true; /* Noncharacter in base plane */                        }
                    }
                }
            } else {
if (Character.isISOControl(c) ||Character.isLowSurrogate(c)) {
isBad=true; /* Control character or no high surrogate */                } elseif (c>=0xfdd0&& (c==0xfffe||c>=0xfdd0||c<=0xfddf)) {
isBad=true; /* Noncharacter in other nonbase plane */                }
            }
if (isBad) {
returnfalse;
            }
        }
returntrue;
    }

(2)将含有非utf-8编码的发送主题topic name 或playlod数据查找出来

if (!ValidateUtils.validateUTF8String(topicName)) {
System.out.println("topicName-not-utf-8 "+topicName);
return;
}
if (!ValidateUtils.validateUTF8String(playload)) {
System.out.println("not-utf-8 "+", "+playload);
return;
}
  • 使用replaceAll("(\\r\\n|\\n|\\\\n|\\s)", "")方法将topicName或playload数据中包含的特殊字符去掉。
topicName=topicName.replaceAll("(\\r\\n|\\n|\\\\n|\\s)", "");
bytepayload[] =data.replaceAll("(\\r\\n|\\n|\\\\n|\\s)", "");
producer.produce(topicName, payload, Qos.AT_MOST_ONCE, false);
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
494 4
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
1451 20
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
580 3
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
640 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
606 0
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
362 0
rabbitmq基础教程(ui,java,springamqp)
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
830 0
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
872 3
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java系列之:字符串UTF-8 编码格式转换位 UTF-32 【生僻字截取问题】
这篇文章讨论了在Java中处理包含生僻字的字符串时可能遇到的问题,并提供了一种解决方法:将字符串的编码格式从UTF-8转换为UTF-32,以确保每个字符都占用固定的字节数,从而避免在截取操作中破坏字符,示例代码展示了如何进行编码转换和字符串截取。