解决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
目录
相关文章
|
8月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
358 13
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
442 5
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
693 30
|
Java Linux 数据库
java连接kerberos用户认证
java连接kerberos用户认证
439 22
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
756 2
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
428 6
如何用java的虚拟线程连接数据库
|
存储 消息中间件 安全
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中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
499 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
449 3
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
940 6