在同一台服务器上采用docker部署spring boot项目和EMQX服务,连接失败,本地是可以连接成功

错误报告

环境

  • EMQX 版本:开源版V4.4
  • 操作系统版本:centos 7

重现此问题的步骤

  1. 服务器上用docker部署 spring boot项目
  2. 服务器上用docker部署 EMQX项目
  3. spring boot项目启动的时候,连接EMXQ提示错误

预期行为

正确连接上EMQX服务

实际行为

2023-02-08T01:48:05.492147629Z org.eclipse.paho.client.mqttv3.MqttException: Broker unavailable
2023-02-08T01:48:05.492153063Z at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:31)
2023-02-08T01:48:05.492156863Z at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:1040)
2023-02-08T01:48:05.492160937Z at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:151)
2023-02-08T01:48:05.492164880Z at java.lang.Thread.run(Thread.java:750)

功能请求

描述你需要的功能

为什么你需要这个功能


其他

本地启动spring boot项目是可以连上EMQX服务的,本地和服务器上的项目都是连得同一个EMQX服务
本地是使用服务器公网ip地址,服务器上的项目是使用公网ip,内网ip,docker 容器ip地址都是同样的错误,在spring boot 容器里面ping EMQX容器ip 和telnet EMQX容器ip:1883 都是成功的

可以追踪一下你的客户端看下详细的连接日志。

public MqttClient uavBatteryMqttClient(UavBatteryStatusMqttClientProperty mqttClientProperty, UavBatteryStatusOnMessageCallback callback){
MemoryPersistence persistence = new MemoryPersistence();
String broker = mqttClientProperty.getBroker();
MqttClient client = null;
try {
client = new MqttClient(broker, mqttClientProperty.getClientId(), persistence);
// MQTT 连接选项
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setUserName(mqttClientProperty.getUserName());
connOpts.setPassword(mqttClientProperty.getPassword().toCharArray());
// 保留会话
connOpts.setCleanSession(true);
// 设置回调
client.setCallback(callback);
// 建立连接
log.info(“无人机电池状态,client:{}connOpts: {}”,client.getServerURI(),JSON.toJSONString(connOpts));
client.connect(connOpts);
log.info(“无人机电池状态Connecting successful”);
// 订阅
client.subscribe(mqttClientProperty.getSubTopic());
} catch (MqttException e) {
log.error(“无人机电池状态客户端初始化异常”,e);
}
return client;
}

这里只能看到连接的基本信息

是由于打开了HTTP校验,EMQX服务调用http服务不通

你是 MQTT 客户端无法连接 EMQX,还是 EMQX 无法连接 HTTP 服务?

客户端无法链接EMQX,EMQX服务的日志内容显示是 EMQX无法连接我提供的HTTP服务接口

所以是两个问题?

客户端无法连接可以追踪一下看看,详见 追踪 文档。

EMQX 无法连接你的 HTTP Server,可以看下 EMQX 日志里面的报错信息,或者发到帖子里我们看一下(注意隐藏敏感信息)。