From 59b2b9f422a95662268d14f0ce8a9bf8bf4708ed Mon Sep 17 00:00:00 2001 From: Yannic Klem Date: Tue, 2 Feb 2021 15:46:26 +0100 Subject: [PATCH] Remove blocking instantiation of DittoClient * Always return DisconnectedDittoClient which can be connected asynchronously by calling DisconnectedDittoClient#connect() Signed-off-by: Yannic Klem --- java/pom.xml | 2 +- .../eclipse/ditto/client/DittoClients.java | 108 +----------------- .../client/internal/DefaultDittoClient.java | 28 ----- .../client/messaging/MessagingProvider.java | 10 -- .../ditto/client/DittoClientPoliciesTest.java | 5 +- .../client/DittoClientUsageExamples.java | 10 +- .../internal/AbstractDittoClientTest.java | 5 +- .../client/internal/ClientShutdownTest.java | 2 +- 8 files changed, 23 insertions(+), 147 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index c823a500..cc9de354 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -240,7 +240,7 @@ - 1.4.0 + ${revision} false diff --git a/java/src/main/java/org/eclipse/ditto/client/DittoClients.java b/java/src/main/java/org/eclipse/ditto/client/DittoClients.java index c127db09..bc61e224 100755 --- a/java/src/main/java/org/eclipse/ditto/client/DittoClients.java +++ b/java/src/main/java/org/eclipse/ditto/client/DittoClients.java @@ -37,104 +37,6 @@ private DittoClients() { throw new AssertionError(); } - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a shared {@code Twin} and {@code Live} - * {@link org.eclipse.ditto.client.messaging.MessagingProvider}. - * - * @param messagingProvider the messaging provider for this client. - * @return the client. - * @throws org.eclipse.ditto.client.messaging.AuthenticationException if authentication failed. - * @throws org.eclipse.ditto.client.messaging.MessagingException if a connection to the configured endpoint - * could not be established - */ - public static DittoClient newInstance(final MessagingProvider messagingProvider) { - return newInstance(messagingProvider, messagingProvider); - } - - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a specific {@code Twin} and {@code Live} - * {@link org.eclipse.ditto.client.messaging.MessagingProvider}. - * - * @param twinMessagingProvider the messaging provider for the {@code Twin} part of the client. - * @param liveMessagingProvider the messaging provider for the {@code Live} part of the client. - * @return the client. - * @throws org.eclipse.ditto.client.messaging.AuthenticationException if authentication failed. - * @throws org.eclipse.ditto.client.messaging.MessagingException if a connection to the configured endpoint - * could not be established - */ - public static DittoClient newInstance(final MessagingProvider twinMessagingProvider, - final MessagingProvider liveMessagingProvider) { - - return newInstance(twinMessagingProvider, liveMessagingProvider, twinMessagingProvider); - } - - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a specific {@code Twin} and {@code Live} - * {@link org.eclipse.ditto.client.messaging.MessagingProvider}. - * - * @param twinMessagingProvider the messaging provider for the {@code Twin} part of the client. - * @param liveMessagingProvider the messaging provider for the {@code Live} part of the client. - * @param policyMessagingProvider the messaging provider for the {@code Policy} part of the client. - * @return the client. - * @throws org.eclipse.ditto.client.messaging.AuthenticationException if authentication failed. - * @throws org.eclipse.ditto.client.messaging.MessagingException if a connection to the configured endpoint - * could not be established - * @since 1.1.0 - */ - public static DittoClient newInstance(final MessagingProvider twinMessagingProvider, - final MessagingProvider liveMessagingProvider, - final MessagingProvider policyMessagingProvider) { - - final MessageSerializerRegistry messageSerializerRegistry = - MessageSerializerFactory.newInstance().getMessageSerializerRegistry(); - return newInstance(twinMessagingProvider, liveMessagingProvider, policyMessagingProvider, - messageSerializerRegistry); - } - - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a specific {@code Twin} and {@code Live} - * {@link org.eclipse.ditto.client.messaging.MessagingProvider}. - * - * @param twinMessagingProvider the messaging provider for the {@code Twin} part of the client. - * @param liveMessagingProvider the messaging provider for the {@code Live} part of the client. - * @param messageSerializerRegistry a registry of {@code MessageSerializer}s for the {@code Live} part of the client. - * @return the client. - * @throws org.eclipse.ditto.client.messaging.AuthenticationException if authentication failed. - * @throws org.eclipse.ditto.client.messaging.MessagingException if a connection to the configured endpoint - * could not be established - */ - public static DittoClient newInstance(final MessagingProvider twinMessagingProvider, - final MessagingProvider liveMessagingProvider, - final MessageSerializerRegistry messageSerializerRegistry) { - - return newInstance(twinMessagingProvider, liveMessagingProvider, twinMessagingProvider, - messageSerializerRegistry); - } - - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a specific {@code Twin}, {@code Live} and - * {@code Policy} {@link org.eclipse.ditto.client.messaging.MessagingProvider}. - * - * @param twinMessagingProvider the messaging provider for the {@code Twin} part of the client. - * @param liveMessagingProvider the messaging provider for the {@code Live} part of the client. - * @param policyMessagingProvider the messaging provider for the {@code Policy} part of the client. - * @param messageSerializerRegistry a registry of {@code MessageSerializer}s for the {@code Live} part of the client. - * @return the client. - * @throws org.eclipse.ditto.client.messaging.AuthenticationException if authentication failed. - * @throws org.eclipse.ditto.client.messaging.MessagingException if a connection to the configured endpoint - * could not be established - * @since 1.1.0 - */ - public static DittoClient newInstance(final MessagingProvider twinMessagingProvider, - final MessagingProvider liveMessagingProvider, final MessagingProvider policyMessagingProvider, - final MessageSerializerRegistry messageSerializerRegistry) { - - return DefaultDittoClient.newInstance(twinMessagingProvider, - liveMessagingProvider, - policyMessagingProvider, - messageSerializerRegistry); - } - /** * Creates a new {@link org.eclipse.ditto.client.DittoClient} with a shared {@code Twin} and {@code Live} * {@link org.eclipse.ditto.client.messaging.MessagingProvider} but does not attempt to connect to the configured @@ -142,10 +44,10 @@ public static DittoClient newInstance(final MessagingProvider twinMessagingProvi * * @param messagingProvider the messaging provider for this client. * @return the disconnected client. - * @since 1.3.0 + * @since 2.0.0 */ - public static DisconnectedDittoClient newDisconnectedInstance(final MessagingProvider messagingProvider) { - return newDisconnectedInstance(messagingProvider, messagingProvider, messagingProvider, + public static DisconnectedDittoClient newInstance(final MessagingProvider messagingProvider) { + return newInstance(messagingProvider, messagingProvider, messagingProvider, MessageSerializerFactory.newInstance().getMessageSerializerRegistry()); } @@ -159,9 +61,9 @@ public static DisconnectedDittoClient newDisconnectedInstance(final MessagingPro * @param policyMessagingProvider the messaging provider for the {@code Policy} part of the client. * @param messageSerializerRegistry a registry of {@code MessageSerializer}s for the {@code Live} part of the client. * @return the disconnected client. - * @since 1.3.0 + * @since 2.0.0 */ - public static DisconnectedDittoClient newDisconnectedInstance(final MessagingProvider twinMessagingProvider, + public static DisconnectedDittoClient newInstance(final MessagingProvider twinMessagingProvider, final MessagingProvider liveMessagingProvider, final MessagingProvider policyMessagingProvider, final MessageSerializerRegistry messageSerializerRegistry) { diff --git a/java/src/main/java/org/eclipse/ditto/client/internal/DefaultDittoClient.java b/java/src/main/java/org/eclipse/ditto/client/internal/DefaultDittoClient.java index 804f4db6..03cbe982 100644 --- a/java/src/main/java/org/eclipse/ditto/client/internal/DefaultDittoClient.java +++ b/java/src/main/java/org/eclipse/ditto/client/internal/DefaultDittoClient.java @@ -125,34 +125,6 @@ private DefaultDittoClient(final TwinImpl twin, final LiveImpl live, final Polic handleSpontaneousErrors(); } - /** - * Creates a new {@link org.eclipse.ditto.client.DittoClient}. - * - * @param twinMessagingProvider the messaging provider to use for the {@code Twin} aspect. - * @param liveMessagingProvider the messaging provider to use for the {@code Live} aspect. - * @param policyMessagingProvider the messaging provider for the {@code Policy} part of the client. - * @param messageSerializerRegistry registry for all serializers of live messages. - * @return the client. - */ - public static DittoClient newInstance(final MessagingProvider twinMessagingProvider, - final MessagingProvider liveMessagingProvider, - final MessagingProvider policyMessagingProvider, - final MessageSerializerRegistry messageSerializerRegistry) { - - final DisconnectedDittoClient disconnectedClient = - newDisconnectedInstance(twinMessagingProvider, liveMessagingProvider, policyMessagingProvider, - messageSerializerRegistry); - final CompletionStage connectFuture = disconnectedClient.connect(); - - connectFuture.whenComplete((result, error) -> { - if (error != null) { - disconnectedClient.destroy(); - } - }); - - return connectFuture.toCompletableFuture().join(); - } - /** * Create a Ditto client object but do not attempt to connect to the configured back-end. * diff --git a/java/src/main/java/org/eclipse/ditto/client/messaging/MessagingProvider.java b/java/src/main/java/org/eclipse/ditto/client/messaging/MessagingProvider.java index f547aa83..2f201f6f 100644 --- a/java/src/main/java/org/eclipse/ditto/client/messaging/MessagingProvider.java +++ b/java/src/main/java/org/eclipse/ditto/client/messaging/MessagingProvider.java @@ -39,16 +39,6 @@ */ public interface MessagingProvider { - /** - * Initializes the Messaging Provider by opening the underlying connections, etc. - * Blocks the calling thread until messaging provider is ready. - * @deprecated since 1.3.0. Use {@code initializeAsync} instead. - */ - @Deprecated - default void initialize() { - initializeAsync().toCompletableFuture().join(); - } - /** * Perform initialization asynchronously. * diff --git a/java/src/test/java/org/eclipse/ditto/client/DittoClientPoliciesTest.java b/java/src/test/java/org/eclipse/ditto/client/DittoClientPoliciesTest.java index 3cc1761e..6e76f6f8 100644 --- a/java/src/test/java/org/eclipse/ditto/client/DittoClientPoliciesTest.java +++ b/java/src/test/java/org/eclipse/ditto/client/DittoClientPoliciesTest.java @@ -56,7 +56,10 @@ public final class DittoClientPoliciesTest extends AbstractDittoClientTest { @Test public void verifyClientDefaultsToSchemaVersion2ForPolicyCommands() { messaging = new MockMessagingProvider(JsonSchemaVersion.V_1); - final DittoClient client = DittoClients.newInstance(messaging); + final DittoClient client = DittoClients.newInstance(messaging) + .connect() + .toCompletableFuture() + .join(); assertEventualCompletion(client.policies().retrieve(POLICY_ID).thenRun(client::destroy)); final RetrievePolicy command = expectMsgClass(RetrievePolicy.class); reply(RetrievePolicyResponse.of(POLICY_ID, POLICY, command.getDittoHeaders())); diff --git a/java/src/test/java/org/eclipse/ditto/client/DittoClientUsageExamples.java b/java/src/test/java/org/eclipse/ditto/client/DittoClientUsageExamples.java index 7a85e6af..1a811baa 100755 --- a/java/src/test/java/org/eclipse/ditto/client/DittoClientUsageExamples.java +++ b/java/src/test/java/org/eclipse/ditto/client/DittoClientUsageExamples.java @@ -97,8 +97,14 @@ public final class DittoClientUsageExamples { private static final Properties CONFIG; public static void main(final String... args) throws ExecutionException, InterruptedException { - final DittoClient client = DittoClients.newInstance(createMessagingProvider()); - final DittoClient client2 = DittoClients.newInstance(createMessagingProvider()); + final DittoClient client = DittoClients.newInstance(createMessagingProvider()) + .connect() + .toCompletableFuture() + .join(); + final DittoClient client2 = DittoClients.newInstance(createMessagingProvider()) + .connect() + .toCompletableFuture() + .join(); if (shouldNotSkip("twin.examples")) { final JsonifiableAdaptable jsonifiableAdaptable = ProtocolFactory.jsonifiableAdaptableFromJson( diff --git a/java/src/test/java/org/eclipse/ditto/client/internal/AbstractDittoClientTest.java b/java/src/test/java/org/eclipse/ditto/client/internal/AbstractDittoClientTest.java index 3cf99e55..8262b4cd 100755 --- a/java/src/test/java/org/eclipse/ditto/client/internal/AbstractDittoClientTest.java +++ b/java/src/test/java/org/eclipse/ditto/client/internal/AbstractDittoClientTest.java @@ -103,7 +103,10 @@ public void before() { LOGGER.debug("active threads before test: {}", startingThreadNames); messaging = new MockMessagingProvider(); messaging.onSend(m -> LOGGER.info("Send message: " + m)); - client = DittoClients.newInstance(messaging); + client = DittoClients.newInstance(messaging) + .connect() + .toCompletableFuture() + .join(); } @After diff --git a/java/src/test/java/org/eclipse/ditto/client/internal/ClientShutdownTest.java b/java/src/test/java/org/eclipse/ditto/client/internal/ClientShutdownTest.java index 485f47e9..b6c902f5 100755 --- a/java/src/test/java/org/eclipse/ditto/client/internal/ClientShutdownTest.java +++ b/java/src/test/java/org/eclipse/ditto/client/internal/ClientShutdownTest.java @@ -50,7 +50,7 @@ public void noThreadLeakWithWebsocketMessagingProvider() throws Exception { stringFuture.toCompletableFuture().join(); // WHEN: client is created - final DisconnectedDittoClient client = DittoClients.newDisconnectedInstance(messaging); + final DisconnectedDittoClient client = DittoClients.newInstance(messaging); // THEN: threads are allocated Assertions.assertThat(getActiveThreads(startingThreadNames)).isNotEmpty();