/ / Mqtt Paho - спроба опублікувати в той час як брокер недоступний - java, groovy, mqtt

Mqtt Paho - Спроба опублікувати в той час як брокер недоступний - java, groovy, mqtt

Я починаю використовувати Mqtt, і мені важко працювати з ненадійною мережею. Я використовую клієнта Paho Java (у groovy) для публікації повідомлень віддаленому брокеру Mosquitto.

Чи є спосіб, коли брокер недоступний,щоб клієнт Paho зберігав повідомлення і автоматично повторно підключався до брокера і публікував локально збережені повідомлення? Чи треба мені самому поводитися, використовуючи, наприклад, місцевого брокера?

Ось код моєї клієнтської будівлі

    String persistenceDir = config["persistence-dir"] ?: System.getProperty("java.io.tmpdir")
def persistence = new MqttDefaultFilePersistence(persistenceDir)
client = new MqttAsyncClient(uri, clientId, persistence)
client.setCallback(this)
options = new MqttConnectOptions()
if (config.password) {
options.setPassword(config.password as char[])
options.setUserName(config.user)
}
options.setCleanSession(false)
client.connect(options)

І мій публікувати код

  def message = new MqttMessage(Json.encode(outgoingMessage).getBytes())
try {
client?.connect(options)
def topic = client.getTopic("processMsg")
message.setQos(1)
def token = topic.publish(message)
if (client) {
client.disconnect()
}

Дякую

Відповіді:

3 для відповіді № 1

Клієнт Paho зберігатиме повідомлення тільки в польоті, коли він підключений до брокера.

Зазвичай, коли виникають проблеми з підключенням, ви побачите час очікування повідомлень

  • Час очікування відповіді від сервера (32000)

У цей момент повідомлення все одно буде зберігатися.

Однак, коли зв'язок втрачається, і ви починаєте це бачити

  • Клієнт не підключений (32104)

Ви повинні припустити, що Paho не зберігає повідомлення.

Ви можете налагодити це в org.eclipse.paho.client.mqttv3.internal.ClientComms :

/**
* Sends a message to the broker if in connected state, but only waits for the message to be
* stored, before returning.
*/
public void sendNoWait(MqttWireMessage message, MqttToken token) throws MqttException {
final String methodName = "sendNoWait";
if (isConnected() ||
(!isConnected() && message instanceof MqttConnect) ||
(isDisconnecting() && message instanceof MqttDisconnect)) {
this.internalSend(message, token);
} else {
//@TRACE 208=failed: not connected
log.fine(className, methodName, "208");
throw ExceptionHelper.createMqttException(MqttException.REASON_CODE_CLIENT_NOT_CONNECTED);
}
}

The internalSend зберігатиметься повідомлення, але тільки якщо воно пов'язане з брокером.

Також візьміть до уваги, що існує максимальна кількість повідомлень про польоти, які Paho може обробити. Якщо він перевищує, він також вирішить не зберігати повідомлення.


0 для відповіді № 2

Так ... Після того, як ви отримаєте виняток, що повідомлення не може бути доставлене, воно повинно бути або збережене, або повідомлення потрібно регенерувати.

Якщо ви плануєте використовувати місцевого брокера, ви можете звернутися до Really Small Message Broker (https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=d5bedadd-e46f-4c97-af89-22d65ffee070)


0 для відповіді № 3

Ви можете просто налаштувати місцевого брокера і перетворити його з віддаленим брокером. Таким чином, ви можете розмістити в черзі всі ваші повідомлення локально, і коли віддалений брокер повернеться онлайн, все може бути доставлено.