GH-3959: MqttConFailedEvent for normal disconnect (#3961)

* GH-3959: MqttConFailedEvent for normal disconnect

Fixes https://github.com/spring-projects/spring-integration/issues/3959

The `MqttCallback.disconnected(MqttDisconnectResponse)` in Paho v5 client is also
called when server initiates a disconnection.
In this case that `MqttDisconnectResponse` does not have a `cause` value

* Modify `MqttConnectionFailedEvent` to make a `cause` property optional
* Fix `Mqttv5PahoMessageDrivenChannelAdapter` & `Mqttv5PahoMessageHandler`
to not check for `cause`, but emit an `MqttConnectionFailedEvent` for any `disconnected()` calls

Unfortunately current Paho v3 client does not call `connectionLost()` for normal disconnections
and we cannot react for this callback with an `MqttConnectionFailedEvent`

**Cherry-pick to `5.5.x`**

* Fix language in doc

Co-authored-by: Gary Russell <grussell@vmware.com>

Co-authored-by: Gary Russell <grussell@vmware.com>
This commit is contained in:
Artem Bilan
2022-12-07 08:56:40 -05:00
committed by Gary Russell
parent 026feeeedf
commit 280eb29f62
5 changed files with 22 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2015-2019 the original author or authors.
* Copyright 2015-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,15 +16,26 @@
package org.springframework.integration.mqtt.event;
import org.springframework.lang.Nullable;
/**
* The {@link MqttIntegrationEvent} to notify about lost connection to the server.
* When normal disconnection is happened (initiated by the server), the {@code cause} is null.
*
* @author Gary Russell
* @author Artem Bilan
*
* @since 4.2.2
*
*/
@SuppressWarnings("serial")
public class MqttConnectionFailedEvent extends MqttIntegrationEvent {
public MqttConnectionFailedEvent(Object source, Throwable cause) {
public MqttConnectionFailedEvent(Object source) {
super(source);
}
public MqttConnectionFailedEvent(Object source, @Nullable Throwable cause) {
super(source, cause);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2020 the original author or authors.
* Copyright 2014-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,12 +17,15 @@
package org.springframework.integration.mqtt.event;
import org.springframework.integration.events.IntegrationEvent;
import org.springframework.lang.Nullable;
/**
* Base class for Mqtt Events. For {@link #getSourceAsType()}, you should use a sub type
* Base class for Mqtt Events. For {@link #getSourceAsType()}, you should use a subtype
* of {@link org.springframework.integration.mqtt.core.MqttComponent} for the receiving
* variable.
*
* @author Gary Russell
* @author Artem Bilan
*
* @since 4.1
*/
@@ -33,7 +36,7 @@ public abstract class MqttIntegrationEvent extends IntegrationEvent {
super(source);
}
public MqttIntegrationEvent(Object source, Throwable cause) {
public MqttIntegrationEvent(Object source, @Nullable Throwable cause) {
super(source, cause);
}

View File

@@ -292,7 +292,7 @@ public class Mqttv5PahoMessageDrivenChannelAdapter extends AbstractMqttMessageDr
public void disconnected(MqttDisconnectResponse disconnectResponse) {
MqttException cause = disconnectResponse.getException();
ApplicationEventPublisher applicationEventPublisher = getApplicationEventPublisher();
if (cause != null && applicationEventPublisher != null) {
if (applicationEventPublisher != null) {
applicationEventPublisher.publishEvent(new MqttConnectionFailedEvent(this, cause));
}
}

View File

@@ -274,7 +274,7 @@ public class Mqttv5PahoMessageHandler extends AbstractMqttMessageHandler
public void disconnected(MqttDisconnectResponse disconnectResponse) {
MqttException cause = disconnectResponse.getException();
ApplicationEventPublisher applicationEventPublisher = getApplicationEventPublisher();
if (cause != null && applicationEventPublisher != null) {
if (applicationEventPublisher != null) {
applicationEventPublisher.publishEvent(new MqttConnectionFailedEvent(this, cause));
}
}

View File

@@ -404,6 +404,7 @@ public class MqttJavaApplication {
Certain application events are published by the adapters.
* `MqttConnectionFailedEvent` - published by both adapters if we fail to connect or a connection is subsequently lost.
For the MQTT v5 Paho client, this event is also emitted when the server performs a normal disconnection, in which case the `cause` of the lost connection is `null`.
* `MqttMessageSentEvent` - published by the outbound adapter when a message has been sent, if running in asynchronous mode.
* `MqttMessageDeliveredEvent` - published by the outbound adapter when the client indicates that a message has been delivered, if running in asynchronous mode.
* `MqttSubscribedEvent` - published by the inbound adapter after subscribing to the topics.