解决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一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 物联网 网络性能优化
MQTT常见问题之mqtt 连接一直显示 Not authorized to connect如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
1月前
|
数据采集 Java 关系型数据库
Java代码高效连接数据库
Java代码高效连接数据库
20 2
|
2月前
|
IDE 关系型数据库 MySQL
【Java+MySQL】前后端连接小白教程
【Java+MySQL】前后端连接小白教程
37 0
|
3月前
|
Linux Windows
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
174 0
|
10天前
|
前端开发 NoSQL JavaScript
java域控连接AD遇到的问题
java域控连接AD遇到的问题
|
29天前
java.lang.IllegalArgumentException: Invalid character found in method name
java.lang.IllegalArgumentException: Invalid character found in method name
18 0
|
1月前
|
弹性计算 物联网 网络性能优化
MQTT常见问题之connection reset by peer 异常如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
1月前
|
Java Maven Android开发
java如何连接mqtt
java如何连接mqtt
45 0
|
2月前
|
NoSQL Java MongoDB
java 连接mongodb的样例代码
java 连接mongodb的样例代码
|
2月前
|
物联网 Linux 开发工具
MQTT协议接入问题之连接失败如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
143 2

热门文章

最新文章