From 1dac94e2153b80ac3bb5946bdc00bc5a8285c8dd Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:10:33 +0800 Subject: [PATCH 1/6] bugfix(java): fix reconnect logic --- .../sdk/internal/infra/CallbackManager.java | 17 ++++---- .../sdk/test/e2e/ws/spot/PrivateTest.java | 26 +++-------- .../test/robustness/ws/ReliabilityTest.java | 43 +++++++++++++++++++ 3 files changed, 58 insertions(+), 28 deletions(-) diff --git a/sdk/java/src/main/java/com/kucoin/universal/sdk/internal/infra/CallbackManager.java b/sdk/java/src/main/java/com/kucoin/universal/sdk/internal/infra/CallbackManager.java index 2951ccaf..453bbf01 100644 --- a/sdk/java/src/main/java/com/kucoin/universal/sdk/internal/infra/CallbackManager.java +++ b/sdk/java/src/main/java/com/kucoin/universal/sdk/internal/infra/CallbackManager.java @@ -63,17 +63,16 @@ List getSubInfo() { for (String topic : topics) { int idx = topic.indexOf(':'); - if (idx == -1) { // no arg => treat as "all" - continue; - } - String arg = topic.substring(idx + 1); - if (!"all".equals(arg)) { - args.add(arg); + if (idx != -1) { + String arg = topic.substring(idx + 1); + if (!"all".equals(arg)) { + args.add(arg); + } } // pick callback from any topic (they’re identical for this id) - if (cb == null) { - Callback holder = topicCbs.get(topic); - if (holder != null) cb = holder.callback; + Callback holder = topicCbs.get(topic); + if (holder != null) { + cb = holder.callback; } } diff --git a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java index 7744bcf6..ca32c769 100644 --- a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java +++ b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.kucoin.universal.sdk.api.DefaultKucoinClient; import com.kucoin.universal.sdk.api.KucoinClient; +import com.kucoin.universal.sdk.generate.spot.spotprivate.OrderV2Event; import com.kucoin.universal.sdk.generate.spot.spotprivate.SpotPrivateWs; import com.kucoin.universal.sdk.model.ClientOption; import com.kucoin.universal.sdk.model.Constants; @@ -123,26 +124,13 @@ public void testOrderV1() { } @Test - public void testOrderV2() { + public void testOrderV2() throws InterruptedException { CountDownLatch gotEvent = new CountDownLatch(1); - CompletableFuture.supplyAsync( - () -> - api.orderV2( - (__, ___, event) -> { - log.info("event: {}", event.toString()); - gotEvent.countDown(); - })) - .thenApply( - id -> { - try { - gotEvent.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return id; - }) - .thenAccept(id -> api.unSubscribe(id)) - .join(); + api.orderV2( + (String topic, String subject, OrderV2Event data) -> { + log.info("event: {}", data.toString()); + }); + Thread.sleep(1000000000); } @Test diff --git a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/robustness/ws/ReliabilityTest.java b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/robustness/ws/ReliabilityTest.java index 0fbda6d9..e0454506 100644 --- a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/robustness/ws/ReliabilityTest.java +++ b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/robustness/ws/ReliabilityTest.java @@ -5,6 +5,8 @@ import com.kucoin.universal.sdk.generate.spot.market.GetAllSymbolsData; import com.kucoin.universal.sdk.generate.spot.market.GetAllSymbolsReq; import com.kucoin.universal.sdk.generate.spot.market.GetAllSymbolsResp; +import com.kucoin.universal.sdk.generate.spot.spotprivate.OrderV2Event; +import com.kucoin.universal.sdk.generate.spot.spotprivate.SpotPrivateWs; import com.kucoin.universal.sdk.generate.spot.spotpublic.AllTickersEvent; import com.kucoin.universal.sdk.generate.spot.spotpublic.SpotPublicWs; import com.kucoin.universal.sdk.generate.spot.spotpublic.TradeEvent; @@ -184,4 +186,45 @@ public void testReconnect2() throws Exception { Thread.sleep(1000 * 12000); spotPublicWs.stop(); } + + @Test + public void testReconnect3() throws Exception { + String key = System.getenv("API_KEY"); + String secret = System.getenv("API_SECRET"); + String passphrase = System.getenv("API_PASSPHRASE"); + + AtomicInteger atomicInteger = new AtomicInteger(); + + ClientOption clientOpt = + ClientOption.builder() + .key(key) + .secret(secret) + .passphrase(passphrase) + .spotEndpoint(Constants.GLOBAL_API_ENDPOINT) + .futuresEndpoint(Constants.GLOBAL_FUTURES_API_ENDPOINT) + .brokerEndpoint(Constants.GLOBAL_BROKER_API_ENDPOINT) + .transportOption(TransportOption.defaults()) + .websocketClientOption( + WebSocketClientOption.builder() + .eventCallback( + ((event, message) -> { + atomicInteger.incrementAndGet(); + log.info("Event: {}, {}", event, message); + })) + .build()) + .build(); + + KucoinClient kucoinClient = new DefaultKucoinClient(clientOpt); + + SpotPrivateWs spotPrivateWs = kucoinClient.getWsService().newSpotPrivateWS(); + spotPrivateWs.start(); + + spotPrivateWs.orderV2( + (String topic, String subject, OrderV2Event data) -> { + log.info("OrderV2: {}, {}, {}", topic, subject, data); + }); + + Thread.sleep(1000 * 12000); + spotPrivateWs.stop(); + } } From c5eb9162b714dc842571efc2b6cf5a2d3e66e1e7 Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:14:17 +0800 Subject: [PATCH 2/6] feat(java): upgrade to version 0.1.0-alpha --- Makefile | 2 +- README.md | 4 ++-- sdk/java/CHANGELOG.md | 5 ++++- sdk/java/README.md | 4 ++-- sdk/java/example/pom.xml | 2 +- sdk/java/pom.xml | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 67c53cdb..24b641da 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,7 @@ generate: setup-logs $(call generate-code,python,/kucoin_universal_sdk/generate) $(call generate-code,node,/src/generate) $(call generate-code,php,/src/Generate,0.1.3-alpha) - $(call generate-code,java,/src/main/java/com/kucoin/universal/sdk/generate,0.1.0-alpha) + $(call generate-code,java,/src/main/java/com/kucoin/universal/sdk/generate,0.1.1-alpha) .PHONY: gen-postman gen-postman: preprocessor diff --git a/README.md b/README.md index 8173cce8..dab5506b 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,13 @@ npm install kucoin-universal-sdk composer require kucoin/kucoin-universal-sdk=0.1.3-alpha ``` -### Java Installation(0.1.0-alpha) +### Java Installation(0.1.1-alpha) **Note**: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK. ```bash com.kucoin kucoin-universal-sdk - 0.1.0-alpha + 0.1.1-alpha ``` diff --git a/sdk/java/CHANGELOG.md b/sdk/java/CHANGELOG.md index bcd44d28..0cbff8e5 100644 --- a/sdk/java/CHANGELOG.md +++ b/sdk/java/CHANGELOG.md @@ -4,11 +4,14 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) +## 2025-11-04(Java 0.1.1-alpha) +- Bug fix + ## 2025-07-30(Java 0.1.0-alpha) - Release Java implementation ## 2025-06-11(PHP 0.1.3-alpha) -- Add compatibility for PHP versions from 7.4 to 8.x +- Add compatibility for PHP versions from 7.4 to 8.x ## 2025-06-11(1.3.0) - Update the latest APIs, documentation, etc diff --git a/sdk/java/README.md b/sdk/java/README.md index 9f819e0e..cd073eb1 100644 --- a/sdk/java/README.md +++ b/sdk/java/README.md @@ -8,7 +8,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R ## 📦 Installation -### Latest Version: `0.1.0-alpha` +### Latest Version: `0.1.1-alpha` **Note**: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK. @@ -16,7 +16,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R com.kucoin kucoin-universal-sdk - 0.1.0-alpha + 0.1.1-alpha ``` diff --git a/sdk/java/example/pom.xml b/sdk/java/example/pom.xml index 2185f4e1..b5a1d29c 100644 --- a/sdk/java/example/pom.xml +++ b/sdk/java/example/pom.xml @@ -18,7 +18,7 @@ com.kucoin kucoin-universal-sdk - 0.1.0-alpha + 0.1.1-alpha org.projectlombok diff --git a/sdk/java/pom.xml b/sdk/java/pom.xml index e910bf2f..ce1eb671 100644 --- a/sdk/java/pom.xml +++ b/sdk/java/pom.xml @@ -6,7 +6,7 @@ com.kucoin kucoin-universal-sdk - 0.1.0-alpha + 0.1.1-alpha kucoin-universal-sdk https://www.kucoin.com From 0e6c46d22d50944cebeb5ee127f767c9ed10e199 Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:15:04 +0800 Subject: [PATCH 3/6] feat(java): upgrade to version 0.1.0-alpha --- .../main/java/com/kucoin/universal/sdk/generate/Version.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/java/src/main/java/com/kucoin/universal/sdk/generate/Version.java b/sdk/java/src/main/java/com/kucoin/universal/sdk/generate/Version.java index 6ce7364a..edbb1721 100644 --- a/sdk/java/src/main/java/com/kucoin/universal/sdk/generate/Version.java +++ b/sdk/java/src/main/java/com/kucoin/universal/sdk/generate/Version.java @@ -1,6 +1,6 @@ package com.kucoin.universal.sdk.generate; public class Version { - public static final String SDK_VERSION = "0.1.0-alpha"; - public static final String SDK_GENERATE_DATE = "2025-07-29"; + public static final String SDK_VERSION = "0.1.1-alpha"; + public static final String SDK_GENERATE_DATE = "2025-11-04"; } From e0a8cf4ded6ea0d95e2e0c6fad406380c22f0320 Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:29:31 +0800 Subject: [PATCH 4/6] feat(java): upgrade to version 0.1.0-alpha --- sdk/java/script/release_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/java/script/release_test.sh b/sdk/java/script/release_test.sh index 4a05fad1..5e6e70ae 100644 --- a/sdk/java/script/release_test.sh +++ b/sdk/java/script/release_test.sh @@ -4,7 +4,7 @@ set -e if [[ "${USE_LOCAL,,}" == "true" ]]; then cd /src - mvn clean install -DskipTests + mvn clean install -DskipTests -Dgpg.skip=true echo "Local jars installed." else echo "USE_LOCAL is not true, skipping local jar installation." From 8364b7856685052fa3c311f5ef294c8ab46ae2e2 Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:45:39 +0800 Subject: [PATCH 5/6] feat(java): add more tests --- .../java/com/kucoin/test/regression/RunReconnectTest.java | 7 +++++++ sdk/java/script/run_forever_test.sh | 2 +- sdk/java/script/ws_reconnect_test.sh | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sdk/java/example/src/main/java/com/kucoin/test/regression/RunReconnectTest.java b/sdk/java/example/src/main/java/com/kucoin/test/regression/RunReconnectTest.java index 12fef7bd..d6f09313 100644 --- a/sdk/java/example/src/main/java/com/kucoin/test/regression/RunReconnectTest.java +++ b/sdk/java/example/src/main/java/com/kucoin/test/regression/RunReconnectTest.java @@ -7,6 +7,7 @@ import com.kucoin.universal.sdk.generate.futures.futurespublic.FuturesPublicWs; import com.kucoin.universal.sdk.generate.spot.market.GetAllSymbolsData; import com.kucoin.universal.sdk.generate.spot.market.GetAllSymbolsReq; +import com.kucoin.universal.sdk.generate.spot.spotprivate.SpotPrivateWs; import com.kucoin.universal.sdk.generate.spot.spotpublic.SpotPublicWs; import com.kucoin.universal.sdk.model.ClientOption; import com.kucoin.universal.sdk.model.Constants; @@ -54,6 +55,7 @@ public static void runReconnectTest() { .collect(Collectors.toList()); spotWsExample(wsSvc.newSpotPublicWS(), symbols); + privateWsExample(wsSvc.newSpotPrivateWS()); futuresWsExample(wsSvc.newFuturesPublicWS()); log.info("Total subscribe: 53"); @@ -77,6 +79,11 @@ public static void spotWsExample(SpotPublicWs ws, List symbols) { ws.ticker(new String[] {"BTC-USDT", "ETH-USDT"}, RunReconnectTest::noop); } + public static void privateWsExample(SpotPrivateWs ws) { + ws.start(); + ws.orderV2(RunReconnectTest::noop); + } + public static void futuresWsExample(FuturesPublicWs ws) { ws.start(); ws.tickerV2("XBTUSDTM", RunReconnectTest::noop); diff --git a/sdk/java/script/run_forever_test.sh b/sdk/java/script/run_forever_test.sh index d4f53df7..18140289 100644 --- a/sdk/java/script/run_forever_test.sh +++ b/sdk/java/script/run_forever_test.sh @@ -4,7 +4,7 @@ set -e if [[ "${USE_LOCAL,,}" == "true" ]]; then cd /src - mvn clean install -DskipTests + mvn clean install -DskipTests -Dgpg.skip=true echo "Local jars installed." else echo "USE_LOCAL is not true, skipping local jar installation." diff --git a/sdk/java/script/ws_reconnect_test.sh b/sdk/java/script/ws_reconnect_test.sh index c6d076de..2f3d45dd 100644 --- a/sdk/java/script/ws_reconnect_test.sh +++ b/sdk/java/script/ws_reconnect_test.sh @@ -4,7 +4,7 @@ set -e if [[ "${USE_LOCAL,,}" == "true" ]]; then cd /src - mvn clean install -DskipTests + mvn clean install -DskipTests -Dgpg.skip=true echo "Local jars installed." else echo "USE_LOCAL is not true, skipping local jar installation." From 01b6a0569a4318b503faeb9a97e74bbd946278e1 Mon Sep 17 00:00:00 2001 From: "Isaac.Tang" Date: Tue, 4 Nov 2025 17:47:47 +0800 Subject: [PATCH 6/6] feat(java): add more tests --- .../sdk/test/e2e/ws/spot/PrivateTest.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java index ca32c769..7744bcf6 100644 --- a/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java +++ b/sdk/java/src/test/java/com/kucoin/universal/sdk/test/e2e/ws/spot/PrivateTest.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.kucoin.universal.sdk.api.DefaultKucoinClient; import com.kucoin.universal.sdk.api.KucoinClient; -import com.kucoin.universal.sdk.generate.spot.spotprivate.OrderV2Event; import com.kucoin.universal.sdk.generate.spot.spotprivate.SpotPrivateWs; import com.kucoin.universal.sdk.model.ClientOption; import com.kucoin.universal.sdk.model.Constants; @@ -124,13 +123,26 @@ public void testOrderV1() { } @Test - public void testOrderV2() throws InterruptedException { + public void testOrderV2() { CountDownLatch gotEvent = new CountDownLatch(1); - api.orderV2( - (String topic, String subject, OrderV2Event data) -> { - log.info("event: {}", data.toString()); - }); - Thread.sleep(1000000000); + CompletableFuture.supplyAsync( + () -> + api.orderV2( + (__, ___, event) -> { + log.info("event: {}", event.toString()); + gotEvent.countDown(); + })) + .thenApply( + id -> { + try { + gotEvent.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return id; + }) + .thenAccept(id -> api.unSubscribe(id)) + .join(); } @Test