每当我重新启动运行MQTT客户端的WAR项目时,我都会收到客户端收到的最后一条消息,从而得到重复。可能是什么导致了这个?客户代码?服务器配置?
操作系统:Debian GNU / Linux 8.2(jessie); Java :java版本" 1.7.0_91",OpenJDK运行时环境(IcedTea 2.6.3)(7u91-2.6.3-1~deb8u1),OpenJDK 64位服务器VM(建立24.91-b01,混合模式)
Apache Tomcat / 8.0.14(Debian)
来自https://repo.eclipse.org/content/repositories/paho-releases/ Maven资源库的MQTT lib使用以下依赖项:
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.0.1</version>
</dependency>
使用此存根接收消息,实现org.eclipse.paho.client.mqttv3.MqttCallback:
@Override
public void messageArrived(String topic, MqttMessage msg) throws Exception {}
我看到还有另一种可以覆盖的方法,但我没有考虑:
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// TODO Auto-generated method stub
}
我还应该提供什么?
答案 0 :(得分:3)
这是按设计工作的。
问题不在于订阅结束,而是由发布者引起的。
正在发布消息,并将保留位设置为true。
hivemq网站here上保留消息的描述很好,但基本上保留位告诉代理将最后发布的消息与给定主题的标志一起存储,并将其传递给任何客户端他们订阅该主题的重点。这包括客户端重新连接时。用例是为了确保客户端始终拥有最新数据。
仅在发布消息时调用deliveryComplete
函数(客户端库确认消息已根据QOS级别对其进行控制)