当前位置: 首页 > 知识库问答 >
问题:

代理超时/客户端断开连接时的Paho MQTT客户端行为

萧心远
2023-03-14
    null

当MQTT代理变得不可用时,Paho MQTT客户机不能帮助我保证这些QoS2级别的消息将被重新传递,这是正确的说法吗?

因此,我如何区分以下情况,即Client.Publish导致了一个MqttException,其中Paho没有将消息持久化。

Client is currently disconnecting (32102)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms.shutdownConnection(ClientComms.java:297)
    at org.eclipse.paho.client.mqttv3.internal.CommsSender.handleRunException(CommsSender.java:154)
    at org.eclipse.paho.client.mqttv3.internal.CommsSender.run(CommsSender.java:131)
    at java.lang.Thread.run(Thread.java:745)

下面是它在飞行中坚持的地方

Timed out waiting for a response from the server (32000)
    at org.eclipse.paho.client.mqttv3.internal.Token.waitForCompletion(Token.java:94)
    at org.eclipse.paho.client.mqttv3.MqttToken.waitForCompletion(MqttToken.java:50)
    at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:315)
    at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:307)
    null
  • 连接丢失(32109):PAHO保存消息
  • 客户端当前正在断开连接(32102):PAHO丢失消息
  • 等待服务器(32000)的响应超时:消息被持久化PAHO
  • 客户端未连接(32104):PAHO丢失消息

泛美卫生组织的一些最佳实践是什么?

共有1个答案

陆伟
2023-03-14

我没有设计Java客户机,但我可以看到这种行为是如何产生的,它可能会令人困惑。我假设我们在这里谈论的是同步客户端?调用Publish时会遇到所有这些异常吗?

主要原则是:

  1. 如果在发送消息时客户端API没有连接(包括断开连接),则不会尝试发送消息,也不会持久化消息。
  2. 如果当前连接了客户端API,则尝试发送消息,并在发送之前将消息持久化。在QoS2交换完成之前,连接可能会失败,在此过程中,客户端重新连接时将重试消息。
    null
  1. 仅在消息未持久化时引发异常

创建另一个异常类,它清楚地显示消息何时被持久化和何时未被持久化,类似于

    null
 类似资料:
  • 问题内容: 我在ElastiCache上运行Redis集群。 多个进程连接到Redis集群。每个进程都位于Docker容器中。流程不尽相同-我有一个流程,一个流程等。 正常运行几天后,连接到Redis时,我的某些进程开始超时。当我进入受影响的容器并尝试通过到达群集时,与群集的连接超时。这告诉我,问题不仅影响过程,而且影响整个容器。 当我从任何其他容器中使用时,连接都不会出现问题。 我的进程会根据需

  • 我正在使用Apache HTTP客户端联系外部服务。这项服务可能需要几个小时(如果不是更长的话)才能产生响应。我尝试了一些不同的方法,但要么以套接字结束,要么以读取超时结束。我刚刚尝试使用RequestConfig将套接字和连接超时设置为0,根据文档,这应该是无限的,但请求总是在1小时后返回。有什么想法吗?

  • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

  • 我正在尝试访问具有客户端证书的url,并使用以下内容生成密钥: 和密钥存储: 并尝试连接: }