You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2022/08/18 10:03:15 UTC

[camel] 02/06: camel-test-infra-activemq: ensures instances are truly singleton

This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e3857d681be532bd6ce5c292e7db509e091efcd3
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Thu Aug 18 09:54:29 2022 +0200

    camel-test-infra-activemq: ensures instances are truly singleton
---
 .../services/ActiveMQEmbeddedServiceBuilder.java   | 12 +++-
 .../activemq/services/ActiveMQServiceFactory.java  | 81 ++++++++++++++++------
 2 files changed, 69 insertions(+), 24 deletions(-)

diff --git a/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQEmbeddedServiceBuilder.java b/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQEmbeddedServiceBuilder.java
index 27b6eac6e85..f421925062a 100644
--- a/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQEmbeddedServiceBuilder.java
+++ b/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQEmbeddedServiceBuilder.java
@@ -600,17 +600,23 @@ public class ActiveMQEmbeddedServiceBuilder {
         return new ActiveMQEmbeddedServiceBuilder();
     }
 
+    private static String generateDataDirectoryPathForInstance(String name) {
+        return ActiveMQEmbeddedServiceBuilder.class.getResource("/").getFile() + name
+               + ThreadLocalRandom.current().nextInt(1000);
+    }
+
     public static ActiveMQEmbeddedServiceBuilder defaultBroker() {
         return defaultBroker(ActiveMQEmbeddedServiceBuilder.class.getSimpleName());
     }
 
     public static ActiveMQEmbeddedServiceBuilder defaultBroker(String name) {
+        final String dataDirectoryPath = generateDataDirectoryPathForInstance(name);
         return new ActiveMQEmbeddedServiceBuilder()
                 .withDeleteAllMessagesOnStartup(true)
                 .withBrokerName(name)
                 .withAdvisorySupport(false)
                 .withUseJmx(false)
-                .withDataDirectory(ActiveMQEmbeddedServiceBuilder.class.getResource("/").getFile());
+                .withDataDirectory(dataDirectoryPath);
     }
 
     public static ActiveMQEmbeddedServiceBuilder persistentBroker() {
@@ -619,7 +625,7 @@ public class ActiveMQEmbeddedServiceBuilder {
     }
 
     public static ActiveMQEmbeddedServiceBuilder persistentBroker(String name) {
-        final String dataDirectory = ActiveMQEmbeddedServiceBuilder.class.getResource("/").getFile() + File.separator + name;
+        final String dataDirectoryPath = generateDataDirectoryPathForInstance(name);
 
         return new ActiveMQEmbeddedServiceBuilder()
                 .withDeleteAllMessagesOnStartup(true)
@@ -627,7 +633,7 @@ public class ActiveMQEmbeddedServiceBuilder {
                 .withAdvisorySupport(false)
                 .withUseJmx(false)
                 .withPersistent(true)
-                .withDataDirectory(dataDirectory);
+                .withDataDirectory(dataDirectoryPath);
     }
 
 }
diff --git a/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQServiceFactory.java b/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQServiceFactory.java
index 07cd13bdf5f..fd26b785e9b 100644
--- a/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQServiceFactory.java
+++ b/test-infra/camel-test-infra-activemq/src/test/java/org/apache/camel/test/infra/activemq/services/ActiveMQServiceFactory.java
@@ -63,8 +63,11 @@ public final class ActiveMQServiceFactory {
         }
     }
 
-    private static SimpleTestServiceBuilder<ActiveMQService> instance;
-    private static ActiveMQService service;
+    private static SimpleTestServiceBuilder<ActiveMQService> nonPersistentInstanceBuilder;
+    private static ActiveMQService nonPersistentService;
+
+    private static SimpleTestServiceBuilder<ActiveMQService> persistentInstanceBuilder;
+    private static ActiveMQService persistentService;
 
     private ActiveMQServiceFactory() {
 
@@ -81,51 +84,87 @@ public final class ActiveMQServiceFactory {
                 .build();
     }
 
+    /**
+     * Creates a new instance of an embedded ActiveMQ
+     * 
+     * @return a new instance of an embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createVMService() {
         return createSingletonVMService();
     }
 
+    /**
+     * Creates a new instance of an embedded ActiveMQ. It may use a single instance if possible/supported.
+     * 
+     * @return a new instance of an embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createVMServiceInstance() {
-        if (service == null) {
-            if (instance == null) {
-                instance = new SimpleTestServiceBuilder<>("activemq");
-
-                instance.addLocalMapping(() -> new SingletonActiveMQService(new ActiveMQVMService(), "activemq"));
-            }
-        }
+        SimpleTestServiceBuilder<ActiveMQService> instance = new SimpleTestServiceBuilder<>("activemq");
+        instance.addLocalMapping(ActiveMQVMService::new);
 
         return instance.build();
     }
 
+    /**
+     * Creates or reuses a new singleton instance of an embedded ActiveMQ
+     * 
+     * @return an instance of an embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createSingletonVMService() {
-        if (service == null) {
-            service = createVMServiceInstance();
+        if (nonPersistentService == null) {
+            if (nonPersistentInstanceBuilder == null) {
+                nonPersistentInstanceBuilder = new SimpleTestServiceBuilder<>("activemq");
+
+                nonPersistentInstanceBuilder
+                        .addLocalMapping(() -> new SingletonActiveMQService(new ActiveMQVMService(), "activemq"));
+            }
+
+            nonPersistentService = nonPersistentInstanceBuilder.build();
         }
 
-        return service;
+        return nonPersistentService;
     }
 
+    /**
+     * Creates a new instance of a persistent embedded ActiveMQ. It may use a single instance if possible/supported.
+     * 
+     * @return a new instance of a persistent embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createPersistentVMService() {
         return createSingletonPersistentVMService();
     }
 
+    /**
+     * Creates a new instance of a persistent embedded ActiveMQ
+     * 
+     * @return a new instance of a persistent embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createPersistentVMServiceInstance() {
-        if (service == null) {
-            if (instance == null) {
-                instance = new SimpleTestServiceBuilder<>("activemq");
+        SimpleTestServiceBuilder<ActiveMQService> instance = new SimpleTestServiceBuilder<>("activemq");
 
-                instance.addLocalMapping(() -> new SingletonActiveMQService(new ActiveMQPersistentVMService(), "activemq"));
-            }
-        }
+        instance.addLocalMapping(ActiveMQPersistentVMService::new);
 
         return instance.build();
     }
 
+    /**
+     * Creates or reuses a new singleton instance of a persistent embedded ActiveMQ
+     * 
+     * @return an instance of a persistent embedded ActiveMQ
+     */
     public static synchronized ActiveMQService createSingletonPersistentVMService() {
-        if (service == null) {
-            service = createVMServiceInstance();
+        if (persistentService == null) {
+            if (persistentInstanceBuilder == null) {
+                persistentInstanceBuilder = new SimpleTestServiceBuilder<>("activemq");
+
+                persistentInstanceBuilder
+                        .addLocalMapping(
+                                () -> new SingletonActiveMQService(new ActiveMQPersistentVMService(), "activemq-persistent"));
+            }
+
+            persistentService = persistentInstanceBuilder.build();
         }
 
-        return service;
+        return persistentService;
     }
 }