MQTT PAHO - 用于确认成功传递消息的MessageId

问题描述 投票:1回答:1

我用Java开发了一个带有org.eclipse.paho.client.mqttv3 1.2.0版的应用程序。通过iMqttDeliveryToken的messageID识别发送到mqtt代理的消息。

第1步 - 发布消息:

ObjectMapper objectMapper = new ObjectMapper();
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(objectMapper.writeValueAsString(myObject).getBytes()); 
mqttMessage.setQos(1);
IMqttDeliveryToken iMqttDeliveryToken = this.client.publish("/myTopic", mqttMessage);

第2步 - 在数据库中保存消息:

在IMqttDeliveryToken之外,我得到了messageID。这用于保存和识别数据库中的消息。

第3步 - 等待调用deliveryComplete回调:

这为我提供了相同的IMqttDeliveryToken,我再次获得了messageId。

@Override
   public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
      // delete the database entry via messageId from database
}

问题是Step3可能比Step2更快。因此,在我的条目保存在数据库中之前调用回调。我需要知道messageId才能在调用回调之前发送消息以保存它。我无法通过自己生成messageId并将其设置为:

mqttMessage.setId(555);

MQTT生成自己的messageId。所以我的问题:

  1. 是否可以设置自己的messageId?
  2. 我可以在发布之前获取由mqtt客户端生成的messageId吗?
mqtt paho
1个回答
2
投票

不要使用Paho库生成的消息的MQTT id - 因为它

  1. 交付太晚,无法满足您的需求
  2. 如果您发送大量邮件,可能会重复。

相反,使用您自己的id(甚至可能由您的数据库自动生成)并在publishing时将其作为用户定义的上下文对象传递:

Long databaseId = 42;
ObjectMapper objectMapper = new ObjectMapper();
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(objectMapper.writeValueAsString(myObject).getBytes()); 
mqttMessage.setQos(1);
this.client.publish("/myTopic", mqttMessage, databaseId, mPublishCallback);

稍后您可以在发布回调方法中检索id:

private final IMqttActionListener mPublishCallback = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken publishToken) {
        Long databaseId = (Long) publishToken.getUserContext();
    }

    @Override
    public void onFailure(IMqttToken publishToken, Throwable ex) {
        Long databaseId = (Long) publishToken.getUserContext();
    }
};

另外,您使用的是同步客户端吗?我更喜欢使用IMqttAsyncClient

© www.soinside.com 2019 - 2024. All rights reserved.