From 449c82261b9571db6562d86388b11bafc737025f Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 27 Jun 2025 13:28:50 -0700 Subject: [PATCH 01/14] add .of() for creation of MQTT5 Operation Packets directly and test --- .../crt/mqtt5/packets/PublishPacket.java | 26 +++++++++ .../crt/mqtt5/packets/SubscribePacket.java | 21 +++++++ .../crt/mqtt5/packets/UnsubscribePacket.java | 19 +++++++ .../awssdk/crt/test/Mqtt5ClientTest.java | 55 +++++++++++++++++++ 4 files changed, 121 insertions(+) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java index 66cb38e63..9ca789578 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java @@ -181,6 +181,32 @@ public List getSubscriptionIdentifiers() { return this.subscriptionIdentifiers; } + /** + * Creates a {@link PublishPacket} containing only the most common fields: + * topic, QoS, and payload. + *

+ * Internally this is just syntactic sugar around + * {@link PublishPacketBuilder#PublishPacketBuilder(String, QOS, byte[])} + * followed by {@link PublishPacketBuilder#build()}. + * All optional MQTT 5 properties (retain flag, user properties, etc.) + * are left {@code null} / unset. + * + * @param topic The topic this message should be published to. + * @param qos The MQTT quality of service level the message should be delivered with. + * @param payload The payload for the publish message. + * @return a fully-validated, immutable {@code PublishPacket} ready for use + * + * @throws NullPointerException if {@code topic}, {@code qos}, or + * {@code payload} is {@code null} + */ + public static PublishPacket of(String topic, QOS qos, byte[] payload) { + Objects.requireNonNull(topic, "topic"); + Objects.requireNonNull(qos, "qos"); + Objects.requireNonNull(payload, "payload"); + + return new PublishPacketBuilder(topic, qos, payload).build(); + } + /** * Creates a Mqtt5Client options instance * @throws CrtRuntimeException If the system is unable to allocate space for a native MQTT client structure diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java index 4f754f8d6..33725bfc9 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java @@ -28,6 +28,27 @@ private SubscribePacket(SubscribePacketBuilder builder) { this.userProperties = builder.userProperties; } + /** + * Creates a {@link SubscribePacket} containing only a single subscription topic and qos: + * topicFilter, QoS. + *

+ * Internally this is just syntactic sugar around + * {@link SubscribePacketBuilder#SubscribePacketBuilder(String, QOS)} + * followed by {@link SubscribePacketBuilder#build()}. + * + * @param topicFilter The topic filter to subscribe to. + * @param qos The maximum QoS on which the subscriber will accept publish messages. + * @return an immutable {@code SubscribePacket} ready for use + * + * @throws NullPointerException if {@code topicFilter} or {@code qos} is {@code null} + */ + public static SubscribePacket of(String topicFilter, QOS qos) { + Objects.requireNonNull(topicFilter, "topicFilter"); + Objects.requireNonNull(qos, "qos"); + + return new SubscribePacketBuilder(topicFilter, qos).build(); + } + /** * Returns the list of subscriptions that the client wishes to listen to * diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java index d2683fec5..d54ebfd7e 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java @@ -20,6 +20,25 @@ private UnsubscribePacket(UnsubscribePacketBuilder builder) { this.subscriptions = builder.subscriptions; } + /** + * Creates an {@link UnsubscribePacket} containing only a single subscription topic to unsubscribe from: + * topicFilter. + *

+ * Internally this is just syntactic sugar around + * {@link UnsubscribePacketBuilder#UnsubscribePacketBuilder(String)} + * followed by {@link UnsubscribePacketBuilder#build()}. + * + * @param topicFilter The topic filter to unsubscribe from. + * @return an immutable {@code UnsubscribePacket} ready for use + * + * @throws NullPointerException if {@code topicFilter} is {@code null} + */ + public static UnsubscribePacket of(String topicFilter) { + Objects.requireNonNull(topicFilter, "topicFilter"); + + return new UnsubscribePacketBuilder(topicFilter).build(); + } + /** * Returns a list of subscriptions that the client wishes to unsubscribe from. * diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index d167d85a2..ca8913f72 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2191,6 +2191,61 @@ public void Op_SharedSubscription() { } } + @Test + public void Op_DirectPacketBuilders() { + skipIfNetworkUnavailable(); + Assume.assumeNotNull(AWS_TEST_MQTT5_IOT_CORE_HOST, AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); + String testUUID = UUID.randomUUID().toString(); + String testTopic = "test/MQTT5_Binding_Java_" + testUUID; + try { + Mqtt5ClientOptionsBuilder builder = new Mqtt5ClientOptionsBuilder(AWS_TEST_MQTT5_IOT_CORE_HOST, 8883l); + LifecycleEvents_Futured events = new LifecycleEvents_Futured(); + builder.withLifecycleEvents(events); + + TlsContextOptions tlsOptions = TlsContextOptions.createWithMtlsFromPath( + AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); + TlsContext tlsContext = new TlsContext(tlsOptions); + tlsOptions.close(); + builder.withTlsContext(tlsContext); + + PublishEvents_Futured publishEvents = new PublishEvents_Futured(); + builder.withPublishEvents(publishEvents); + + PublishPacket publishPacket = PublishPacket.of(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); + SubscribePacket subscribePacket = SubscribePacket.of(testTopic, QOS.AT_LEAST_ONCE); + UnSubscribePacket unsubscribePacket = UnsubscribePacket.of(testTopic); + + try (Mqtt5Client client = new Mqtt5Client(builder.build())) { + client.start(); + events.connectedFuture.get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + + client.subscribe(subscribePacket).get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + + client.publish(publishPacket).get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + publishEvents.publishReceivedFuture.get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + + publishEvents.publishReceivedFuture = new CompletableFuture<>(); + publishEvents.publishPacket = null; + client.unsubscribe(unsubscribePacket).get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + client.publish(publishPacket).get(OPERATION_TIMEOUT_TIME, TimeUnit.SECONDS); + + assertEquals( + "Publish after unsubscribe still arrived!", + publishEvents.publishPacket, + null); + + client.stop(); + } + + if (tlsContext != null) { + tlsContext.close(); + } + + } catch (Exception ex) { + fail(ex.getMessage()); + } + } + /** * ============================================================ * Error Operation Tests From ae0ea71d5cc96a3310f490da50d4deb7110123da Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 27 Jun 2025 13:33:41 -0700 Subject: [PATCH 02/14] forgot an import --- .../software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java | 1 + .../amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java | 1 + .../amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java index 9ca789578..6a0b4a5c8 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java @@ -11,6 +11,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.Objects; /** * Data model of an MQTT5 PUBLISH packet diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java index 33725bfc9..470cf3e50 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java @@ -10,6 +10,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.Objects; import software.amazon.awssdk.crt.mqtt5.QOS; diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java index d54ebfd7e..456133270 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Data model of an MQTT5 UNSUBSCRIBE packet. From 72e1f130b959a5ca2fd09e165167a6e583362051 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 27 Jun 2025 13:44:23 -0700 Subject: [PATCH 03/14] UnSubscribePacket -> UnsubscribePacket --- .../java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index ca8913f72..24fd0d069 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2213,7 +2213,7 @@ public void Op_DirectPacketBuilders() { PublishPacket publishPacket = PublishPacket.of(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); SubscribePacket subscribePacket = SubscribePacket.of(testTopic, QOS.AT_LEAST_ONCE); - UnSubscribePacket unsubscribePacket = UnsubscribePacket.of(testTopic); + UnsubscribePacket unsubscribePacket = UnsubscribePacket.of(testTopic); try (Mqtt5Client client = new Mqtt5Client(builder.build())) { client.start(); From 9249e93fad82767cd1f23022cdacd05695adc40c Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Mon, 30 Jun 2025 10:33:51 -0700 Subject: [PATCH 04/14] the publish packet has not been validated at this point --- .../software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java index 6a0b4a5c8..50e9d9814 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java @@ -195,7 +195,7 @@ public List getSubscriptionIdentifiers() { * @param topic The topic this message should be published to. * @param qos The MQTT quality of service level the message should be delivered with. * @param payload The payload for the publish message. - * @return a fully-validated, immutable {@code PublishPacket} ready for use + * @return an immutable {@code PublishPacket} ready for use * * @throws NullPointerException if {@code topic}, {@code qos}, or * {@code payload} is {@code null} From c9afe954e9baad1aa48cfda03e38b71e43ed43b3 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 11 Jul 2025 10:43:44 -0700 Subject: [PATCH 05/14] restore SharedSubscription test lost in merge --- .../amazon/awssdk/crt/test/Mqtt5ClientTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index b758a2b3b..cdaefdc92 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2090,6 +2090,17 @@ private void doOp_SharedSubscriptionTest() { } } + /* Shared subscriptions test */ + @Test + public void Op_SharedSubscription() throws Exception { + skipIfNetworkUnavailable(); + Assume.assumeNotNull(AWS_TEST_MQTT5_IOT_CORE_HOST, AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); + + TestUtils.doRetryableTest(this::doOp_SharedSubscriptionTest, TestUtils::isRetryableTimeout, MAX_TEST_RETRIES, TEST_RETRY_SLEEP_MILLIS); + + CrtResource.waitForNoResources(); + } + @Test public void Op_DirectPacketBuilders() { skipIfNetworkUnavailable(); From 54c517a8fbceed5b1de8f0647394e9d33419a6cb Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 11 Jul 2025 10:47:08 -0700 Subject: [PATCH 06/14] add retry wrapper to new test --- .../amazon/awssdk/crt/test/Mqtt5ClientTest.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index cdaefdc92..60d3a3997 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2101,10 +2101,7 @@ public void Op_SharedSubscription() throws Exception { CrtResource.waitForNoResources(); } - @Test - public void Op_DirectPacketBuilders() { - skipIfNetworkUnavailable(); - Assume.assumeNotNull(AWS_TEST_MQTT5_IOT_CORE_HOST, AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); + public void doOp_DirectPacketBuilders() { String testUUID = UUID.randomUUID().toString(); String testTopic = "test/MQTT5_Binding_Java_" + testUUID; try { @@ -2156,6 +2153,16 @@ public void Op_DirectPacketBuilders() { } } + @Test + public void Op_DirectPacketBuilders() { + skipIfNetworkUnavailable(); + Assume.assumeNotNull(AWS_TEST_MQTT5_IOT_CORE_HOST, AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); + + TestUtils.doRetryableTest(this::doOp_DirectPacketBuilders, TestUtils::isRetryableTimeout, MAX_TEST_RETRIES, TEST_RETRY_SLEEP_MILLIS); + + CrtResource.waitForNoResources(); + } + /** * ============================================================ * Error Operation Tests From df84aad6971e418ce4806abb86d77c9fb7f54e81 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 11 Jul 2025 11:10:15 -0700 Subject: [PATCH 07/14] of -> new --- .../amazon/awssdk/crt/mqtt5/packets/PublishPacket.java | 2 +- .../amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java | 2 +- .../awssdk/crt/mqtt5/packets/UnsubscribePacket.java | 2 +- .../software/amazon/awssdk/crt/test/Mqtt5ClientTest.java | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java index 50e9d9814..3105a8bb7 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java @@ -200,7 +200,7 @@ public List getSubscriptionIdentifiers() { * @throws NullPointerException if {@code topic}, {@code qos}, or * {@code payload} is {@code null} */ - public static PublishPacket of(String topic, QOS qos, byte[] payload) { + public static PublishPacket new(String topic, QOS qos, byte[] payload) { Objects.requireNonNull(topic, "topic"); Objects.requireNonNull(qos, "qos"); Objects.requireNonNull(payload, "payload"); diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java index 470cf3e50..25b8873c5 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java @@ -43,7 +43,7 @@ private SubscribePacket(SubscribePacketBuilder builder) { * * @throws NullPointerException if {@code topicFilter} or {@code qos} is {@code null} */ - public static SubscribePacket of(String topicFilter, QOS qos) { + public static SubscribePacket new(String topicFilter, QOS qos) { Objects.requireNonNull(topicFilter, "topicFilter"); Objects.requireNonNull(qos, "qos"); diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java index 456133270..1d5ad638d 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java @@ -34,7 +34,7 @@ private UnsubscribePacket(UnsubscribePacketBuilder builder) { * * @throws NullPointerException if {@code topicFilter} is {@code null} */ - public static UnsubscribePacket of(String topicFilter) { + public static UnsubscribePacket new(String topicFilter) { Objects.requireNonNull(topicFilter, "topicFilter"); return new UnsubscribePacketBuilder(topicFilter).build(); diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index 60d3a3997..7933b1727 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2118,9 +2118,9 @@ public void doOp_DirectPacketBuilders() { PublishEvents_Futured publishEvents = new PublishEvents_Futured(); builder.withPublishEvents(publishEvents); - PublishPacket publishPacket = PublishPacket.of(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); - SubscribePacket subscribePacket = SubscribePacket.of(testTopic, QOS.AT_LEAST_ONCE); - UnsubscribePacket unsubscribePacket = UnsubscribePacket.of(testTopic); + PublishPacket publishPacket = PublishPacket.new(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); + SubscribePacket subscribePacket = SubscribePacket.new(testTopic, QOS.AT_LEAST_ONCE); + UnsubscribePacket unsubscribePacket = UnsubscribePacket.new(testTopic); try (Mqtt5Client client = new Mqtt5Client(builder.build())) { client.start(); @@ -2149,7 +2149,7 @@ public void doOp_DirectPacketBuilders() { } } catch (Exception ex) { - fail(ex.getMessage()); + throw new RuntimeException(ex); } } From 0e7b5aad26319d6a9b4bf34ff202c407fd5675c7 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 11 Jul 2025 11:19:22 -0700 Subject: [PATCH 08/14] new -> of. new is a keyword that can't be used --- .../amazon/awssdk/crt/mqtt5/packets/PublishPacket.java | 2 +- .../amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java | 2 +- .../amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java | 2 +- .../software/amazon/awssdk/crt/test/Mqtt5ClientTest.java | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java index 3105a8bb7..50e9d9814 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/PublishPacket.java @@ -200,7 +200,7 @@ public List getSubscriptionIdentifiers() { * @throws NullPointerException if {@code topic}, {@code qos}, or * {@code payload} is {@code null} */ - public static PublishPacket new(String topic, QOS qos, byte[] payload) { + public static PublishPacket of(String topic, QOS qos, byte[] payload) { Objects.requireNonNull(topic, "topic"); Objects.requireNonNull(qos, "qos"); Objects.requireNonNull(payload, "payload"); diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java index 25b8873c5..470cf3e50 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/SubscribePacket.java @@ -43,7 +43,7 @@ private SubscribePacket(SubscribePacketBuilder builder) { * * @throws NullPointerException if {@code topicFilter} or {@code qos} is {@code null} */ - public static SubscribePacket new(String topicFilter, QOS qos) { + public static SubscribePacket of(String topicFilter, QOS qos) { Objects.requireNonNull(topicFilter, "topicFilter"); Objects.requireNonNull(qos, "qos"); diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java index 1d5ad638d..456133270 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/packets/UnsubscribePacket.java @@ -34,7 +34,7 @@ private UnsubscribePacket(UnsubscribePacketBuilder builder) { * * @throws NullPointerException if {@code topicFilter} is {@code null} */ - public static UnsubscribePacket new(String topicFilter) { + public static UnsubscribePacket of(String topicFilter) { Objects.requireNonNull(topicFilter, "topicFilter"); return new UnsubscribePacketBuilder(topicFilter).build(); diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index 7933b1727..7e0c0a615 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2118,9 +2118,9 @@ public void doOp_DirectPacketBuilders() { PublishEvents_Futured publishEvents = new PublishEvents_Futured(); builder.withPublishEvents(publishEvents); - PublishPacket publishPacket = PublishPacket.new(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); - SubscribePacket subscribePacket = SubscribePacket.new(testTopic, QOS.AT_LEAST_ONCE); - UnsubscribePacket unsubscribePacket = UnsubscribePacket.new(testTopic); + PublishPacket publishPacket = PublishPacket.of(testTopic, QOS.AT_LEAST_ONCE, "Hello World".getBytes()); + SubscribePacket subscribePacket = SubscribePacket.of(testTopic, QOS.AT_LEAST_ONCE); + UnsubscribePacket unsubscribePacket = UnsubscribePacket.of(testTopic); try (Mqtt5Client client = new Mqtt5Client(builder.build())) { client.start(); From 2735e27bd57a51f856db77b0e5f343d9404f6e6f Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 11 Jul 2025 11:22:43 -0700 Subject: [PATCH 09/14] test edit --- .../java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index 7e0c0a615..e0a73d03b 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -2154,7 +2154,7 @@ public void doOp_DirectPacketBuilders() { } @Test - public void Op_DirectPacketBuilders() { + public void Op_DirectPacketBuilders() throws Exception { skipIfNetworkUnavailable(); Assume.assumeNotNull(AWS_TEST_MQTT5_IOT_CORE_HOST, AWS_TEST_MQTT5_IOT_CORE_RSA_CERT, AWS_TEST_MQTT5_IOT_CORE_RSA_KEY); From 6413a02418a96ad3f90868d583c8224f462735e5 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Fri, 1 Aug 2025 08:27:01 -0700 Subject: [PATCH 10/14] initial deprecation tag to mqtt client --- .../java/software/amazon/awssdk/crt/mqtt/MqttClient.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java index 143862d32..216d06a45 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java @@ -11,12 +11,19 @@ import software.amazon.awssdk.crt.io.TlsContext; /** + *

Deprecated. Use {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client} instead.

+ * + *

The MQTT 3.1.1 client remains fully supported, but migrating to + * MQTT 5 gives you a richer feature set, clearer error handling, and + * improved lifetime management.

+ * * This class wraps aws-c-mqtt to provide the basic MQTT pub/sub functionalities * via the AWS Common Runtime * * One MqttClient class is needed per application. It can create any number of connections to * any number of MQTT endpoints */ +@Deprecated public class MqttClient extends CrtResource { private TlsContext tlsContext; From b89e90cebea6def29b071e4d6658a11a227a4ef0 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Thu, 7 Aug 2025 09:57:29 -0700 Subject: [PATCH 11/14] add deprecation tag to MqttClientConnection --- .../amazon/awssdk/crt/mqtt/MqttClientConnection.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java index c7016dc03..adf69ee8e 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java @@ -22,6 +22,12 @@ import java.util.function.Consumer; /** + *

Deprecated. Use {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client} instead.

+ * + *

The MQTT 3.1.1 client remains fully supported, but migrating to + * MQTT 5 gives you a richer feature set, clearer error handling, and + * improved lifetime management.

+ * * This class wraps aws-c-mqtt to provide the basic MQTT pub/sub functionality * via the AWS Common Runtime * From 489f8d71429f94e612e26753a1b07601c9489b0d Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Thu, 7 Aug 2025 10:19:30 -0700 Subject: [PATCH 12/14] add @deprecated tag to MqttClientConnection --- .../software/amazon/awssdk/crt/mqtt/MqttClientConnection.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java index adf69ee8e..fff9c0119 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java @@ -34,6 +34,7 @@ * MqttClientConnection represents a single connection from one MqttClient to an * MQTT service endpoint */ +@Deprecated public class MqttClientConnection extends CrtResource { private static final int MAX_PORT = 65535; From a5ee1de941a5fcbbf17d48ea880d13f0a697b53f Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Thu, 7 Aug 2025 10:37:02 -0700 Subject: [PATCH 13/14] turn off fail-fast on all matrix ci jobs --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3da12f6a4..add7a0ab9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,6 +30,7 @@ jobs: linux-compat: runs-on: ubuntu-24.04 # latest strategy: + fail-fast: false matrix: image: - manylinux2014-x64 @@ -56,6 +57,7 @@ jobs: linux-compiler-compat: runs-on: ubuntu-24.04 # latest strategy: + fail-fast: false matrix: compiler: - clang-6 @@ -146,6 +148,7 @@ jobs: linux-musl-x64: runs-on: ubuntu-24.04 # latest strategy: + fail-fast: false matrix: image: - alpine-3.16-x64 @@ -163,6 +166,7 @@ jobs: linux-musl-arm: runs-on: ubuntu-24.04 strategy: + fail-fast: false matrix: image: - alpine-3.16-armv7 @@ -183,6 +187,7 @@ jobs: raspberry: runs-on: ubuntu-24.04 # latest strategy: + fail-fast: false matrix: image: - raspbian-bullseye @@ -217,6 +222,7 @@ jobs: windows-vc17: runs-on: windows-2025 # latest strategy: + fail-fast: false matrix: arch: [x86, x64] steps: From cc7e530b7a9d5ab809afdf4ce1bd4f1d3a376158 Mon Sep 17 00:00:00 2001 From: Steve Kim Date: Tue, 12 Aug 2025 13:47:26 -0700 Subject: [PATCH 14/14] updated deprecation message --- .../software/amazon/awssdk/crt/mqtt/MqttClient.java | 10 +++++----- .../amazon/awssdk/crt/mqtt/MqttClientConnection.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java index 216d06a45..b30078286 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClient.java @@ -11,11 +11,11 @@ import software.amazon.awssdk.crt.io.TlsContext; /** - *

Deprecated. Use {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client} instead.

- * - *

The MQTT 3.1.1 client remains fully supported, but migrating to - * MQTT 5 gives you a richer feature set, clearer error handling, and - * improved lifetime management.

+ *

Deprecated. We strongly recommend using {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client}.

+ * + *

There are no current plans to fully deprecate the MQTT 3.1.1 client but it is highly recommended + * customers migrate to the MQTT5 client to access a more robust feature set, clearer error handling, + * and lifetime management. More details can be found in the GitHub Repo FAQ

* * This class wraps aws-c-mqtt to provide the basic MQTT pub/sub functionalities * via the AWS Common Runtime diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java index fff9c0119..f92dac436 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java @@ -22,11 +22,11 @@ import java.util.function.Consumer; /** - *

Deprecated. Use {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client} instead.

- * - *

The MQTT 3.1.1 client remains fully supported, but migrating to - * MQTT 5 gives you a richer feature set, clearer error handling, and - * improved lifetime management.

+ *

Deprecated. We strongly recommend using {@link software.amazon.awssdk.crt.mqtt5.Mqtt5Client}.

+ * + *

There are no current plans to fully deprecate the MQTT 3.1.1 client but it is highly recommended + * customers migrate to the MQTT5 client to access a more robust feature set, clearer error handling, + * and lifetime management. More details can be found in the GitHub Repo FAQ

* * This class wraps aws-c-mqtt to provide the basic MQTT pub/sub functionality * via the AWS Common Runtime