Open TDYJeffreyDevloo opened 1 year ago
Patch for the issue:
Index: org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java b/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java
--- a/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java (revision f4e0db802a4433645ef011e711646a09ec9fae89)
+++ b/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java (revision 7fcaefef9bf9ed5cfa68af4086f5f77aa47b81cc)
@@ -19,6 +19,7 @@
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.util.Hashtable;
+import java.util.Optional;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;
@@ -1273,12 +1274,8 @@
public IMqttToken subscribe(MqttSubscription[] subscriptions, Object userContext, MqttActionListener callback,
IMqttMessageListener messageListener, MqttProperties subscriptionProperties) throws MqttException {
- int subId = 0;
- try {
- subId = subscriptionProperties.getSubscriptionIdentifiers().get(0);
- } catch (IndexOutOfBoundsException e) {
- log.fine(CLASS_NAME, "subscribe", "No sub subscription property(s)");
- }
+ int subId = Optional.ofNullable(subscriptionProperties.getSubscriptionIdentifier())
+ .orElse(0);
// Automatic Subscription Identifier Assignment is enabled
if (connOpts.useSubscriptionIdentifiers() && this.mqttConnection.isSubscriptionIdentifiersAvailable()) {
@@ -1294,9 +1291,15 @@
} else {
// Automatically assign new ID and link to callback.
subId = this.mqttSession.getNextSubscriptionIdentifier();
+ subscriptionProperties.setSubscriptionIdentifier(subId);
+ }
+ } else {
+ if (subId != 0) {
+ log.fine(CLASS_NAME, "subscribe", "Subscription identifiers are not available or disabled");
+ subscriptionProperties.setSubscriptionIdentifier(null);
}
}
-
+
// add message handlers to the list for this client
for (MqttSubscription subscription : subscriptions) {
MqttTopicValidator.validate(subscription.getTopic(),
Auto assigned subscription identifier isn't sent to the broker
The existence of the subscription identifier when subscribing using the MQTT5 client is
A simple demo that demonstrates the issue:
Any user of the API needs to use MqttProperties#setSubscriptionIdentifier regardless of
Automatic Subscription Identifier Assignment
. The property it should be checking within a subscribe is the MqttProperties#getSubscriptionIdentifier. Not the list. The doc states:The correct property asside, the newly chosen subId is used internally https://github.com/eclipse/paho.mqtt.java/blob/master/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java#L1308 but never set when sending the SUBSCRIBE message https://github.com/eclipse/paho.mqtt.java/blob/master/org.eclipse.paho.mqttv5.client/src/main/java/org/eclipse/paho/mqttv5/client/MqttAsyncClient.java#L1314