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:
committed by
Gary Russell
parent
026feeeedf
commit
280eb29f62
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user