You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2024/09/05 08:15:30 UTC
(camel) branch main updated: CAMEL-20199: Remove synchronized block from components G to I (#15444)
This is an automated email from the ASF dual-hosted git repository.
nfilotto pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new b9c8f65492b CAMEL-20199: Remove synchronized block from components G to I (#15444)
b9c8f65492b is described below
commit b9c8f65492b94fbe58798b0a705fd5cc151d031c
Author: Nicolas Filotto <es...@users.noreply.github.com>
AuthorDate: Thu Sep 5 10:15:24 2024 +0200
CAMEL-20199: Remove synchronized block from components G to I (#15444)
---
.../component/as2/api/protocol/ResponseMDN.java | 36 ++++----
.../as2/internal/AS2PropertiesHelper.java | 17 +++-
.../component/aws2/kinesis/KinesisConnection.java | 36 +++++---
.../camel/component/aws2/sqs/Sqs2Consumer.java | 9 +-
.../bean/AbstractCamelInvocationHandler.java | 40 +++++----
.../box/internal/BoxPropertiesHelper.java | 17 +++-
.../braintree/BraintreeConfiguration.java | 90 ++++++++++----------
.../internal/BraintreePropertiesHelper.java | 17 +++-
.../java/org/apache/camel/coap/CoAPComponent.java | 57 +++++++------
.../java/org/apache/camel/coap/CoAPProducer.java | 11 ++-
.../camel/component/consul/ConsulEndpoint.java | 19 +++--
.../component/controlbus/ControlBusComponent.java | 13 ++-
.../dhis2/internal/Dhis2PropertiesHelper.java | 17 +++-
.../dropbox/util/DropboxPropertyManager.java | 34 ++++----
.../fhir/internal/FhirPropertiesHelper.java | 17 +++-
.../bigquery/GoogleBigQueryConnectionFactory.java | 25 ++++--
.../internal/GoogleCalendarPropertiesHelper.java | 17 +++-
.../internal/GoogleDrivePropertiesHelper.java | 17 +++-
.../mail/internal/GoogleMailPropertiesHelper.java | 17 +++-
.../internal/GoogleSheetsPropertiesHelper.java | 17 +++-
.../hazelcast/policy/HazelcastRoutePolicy.java | 28 +++++--
.../camel/http/common/DefaultHttpRegistry.java | 42 +++++++---
.../apache/camel/component/http/HttpEndpoint.java | 22 +++--
.../iec60870/AbstractConnectionMultiplexor.java | 83 ++++++++++--------
.../component/iec60870/AbstractIecComponent.java | 5 +-
.../iec60870/client/ClientConnection.java | 39 ++++++---
.../cluster/InfinispanEmbeddedClusterView.java | 85 +++++++++----------
.../cluster/InfinispanRemoteClusterView.java | 97 ++++++++++------------
.../apache/camel/component/irc/IrcComponent.java | 40 +++++----
.../utils/extensions/JmsServiceExtension.java | 27 +++---
30 files changed, 615 insertions(+), 376 deletions(-)
diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/protocol/ResponseMDN.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/protocol/ResponseMDN.java
index 820c3e818f0..e4849b9bab2 100644
--- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/protocol/ResponseMDN.java
+++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/protocol/ResponseMDN.java
@@ -24,6 +24,8 @@ import java.security.cert.Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.camel.component.as2.api.AS2AsynchronousMDNManager;
import org.apache.camel.component.as2.api.AS2Constants;
@@ -90,6 +92,7 @@ public class ResponseMDN implements HttpResponseInterceptor {
private final String mdnMessageTemplate;
private final Certificate[] validateSigningCertificateChain;
+ private final Lock lock = new ReentrantLock();
private VelocityEngine velocityEngine;
public ResponseMDN(String as2Version, String serverFQDN, AS2SignatureAlgorithm signingAlgorithm,
@@ -320,21 +323,26 @@ public class ResponseMDN implements HttpResponseInterceptor {
}
}
- private synchronized VelocityEngine getVelocityEngine() {
- if (velocityEngine == null) {
- velocityEngine = new VelocityEngine();
-
- // set default properties
- Properties properties = new Properties();
- properties.setProperty(RuntimeConstants.RESOURCE_LOADER, "file, class");
- properties.setProperty("class.resource.loader.description", "Camel Velocity Classpath Resource Loader");
- properties.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
- final Logger velocityLogger = LoggerFactory.getLogger("org.apache.camel.maven.Velocity");
- properties.setProperty(RuntimeConstants.RUNTIME_LOG_NAME, velocityLogger.getName());
-
- velocityEngine.init(properties);
+ private VelocityEngine getVelocityEngine() {
+ lock.lock();
+ try {
+ if (velocityEngine == null) {
+ velocityEngine = new VelocityEngine();
+
+ // set default properties
+ Properties properties = new Properties();
+ properties.setProperty(RuntimeConstants.RESOURCE_LOADER, "file, class");
+ properties.setProperty("class.resource.loader.description", "Camel Velocity Classpath Resource Loader");
+ properties.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
+ final Logger velocityLogger = LoggerFactory.getLogger("org.apache.camel.maven.Velocity");
+ properties.setProperty(RuntimeConstants.RUNTIME_LOG_NAME, velocityLogger.getName());
+
+ velocityEngine.init(properties);
+ }
+ return velocityEngine;
+ } finally {
+ lock.unlock();
}
- return velocityEngine;
}
}
diff --git a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2PropertiesHelper.java b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2PropertiesHelper.java
index 11da1548c5b..2ec7782c039 100644
--- a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2PropertiesHelper.java
+++ b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2PropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.as2.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.as2.AS2Configuration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class AS2PropertiesHelper extends ApiMethodPropertiesHelper<AS2Configuration> {
+ private static final Lock LOCK = new ReentrantLock();
private static AS2PropertiesHelper helper;
private AS2PropertiesHelper(CamelContext context) {
super(context, AS2Configuration.class, AS2Constants.PROPERTY_PREFIX);
}
- public static synchronized AS2PropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new AS2PropertiesHelper(context);
+ public static AS2PropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new AS2PropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-aws/camel-aws2-kinesis/src/main/java/org/apache/camel/component/aws2/kinesis/KinesisConnection.java b/components/camel-aws/camel-aws2-kinesis/src/main/java/org/apache/camel/component/aws2/kinesis/KinesisConnection.java
index c5c23f1270f..ebdc6f255ef 100644
--- a/components/camel-aws/camel-aws2-kinesis/src/main/java/org/apache/camel/component/aws2/kinesis/KinesisConnection.java
+++ b/components/camel-aws/camel-aws2-kinesis/src/main/java/org/apache/camel/component/aws2/kinesis/KinesisConnection.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.aws2.kinesis;
import java.io.Closeable;
import java.io.IOException;
import java.util.Objects;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.camel.component.aws2.kinesis.client.KinesisClientFactory;
import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;
@@ -31,23 +33,33 @@ public class KinesisConnection implements Closeable {
private KinesisClient kinesisClient;
private KinesisAsyncClient kinesisAsyncClient;
+ private final Lock lock = new ReentrantLock();
- public synchronized KinesisClient getClient(final Kinesis2Endpoint endpoint) {
- if (Objects.isNull(kinesisClient)) {
- kinesisClient = endpoint.getConfiguration().getAmazonKinesisClient() != null
- ? endpoint.getConfiguration().getAmazonKinesisClient()
- : KinesisClientFactory.getKinesisClient(endpoint.getConfiguration()).getKinesisClient();
+ public KinesisClient getClient(final Kinesis2Endpoint endpoint) {
+ lock.lock();
+ try {
+ if (Objects.isNull(kinesisClient)) {
+ kinesisClient = endpoint.getConfiguration().getAmazonKinesisClient() != null
+ ? endpoint.getConfiguration().getAmazonKinesisClient()
+ : KinesisClientFactory.getKinesisClient(endpoint.getConfiguration()).getKinesisClient();
+ }
+ return kinesisClient;
+ } finally {
+ lock.unlock();
}
- return kinesisClient;
}
- public synchronized KinesisAsyncClient getAsyncClient(final Kinesis2Endpoint endpoint) {
- if (Objects.isNull(kinesisAsyncClient)) {
- kinesisAsyncClient = KinesisClientFactory
- .getKinesisAsyncClient(endpoint.getConfiguration())
- .getKinesisAsyncClient();
+ public KinesisAsyncClient getAsyncClient(final Kinesis2Endpoint endpoint) {
+ lock.lock();
+ try {
+ if (Objects.isNull(kinesisAsyncClient)) {
+ kinesisAsyncClient
+ = KinesisClientFactory.getKinesisAsyncClient(endpoint.getConfiguration()).getKinesisAsyncClient();
+ }
+ return kinesisAsyncClient;
+ } finally {
+ lock.unlock();
}
- return kinesisAsyncClient;
}
public void setKinesisClient(final KinesisClient kinesisClient) {
diff --git a/components/camel-aws/camel-aws2-sqs/src/main/java/org/apache/camel/component/aws2/sqs/Sqs2Consumer.java b/components/camel-aws/camel-aws2-sqs/src/main/java/org/apache/camel/component/aws2/sqs/Sqs2Consumer.java
index 2bcccabfce7..4637725c20a 100644
--- a/components/camel-aws/camel-aws2-sqs/src/main/java/org/apache/camel/component/aws2/sqs/Sqs2Consumer.java
+++ b/components/camel-aws/camel-aws2-sqs/src/main/java/org/apache/camel/component/aws2/sqs/Sqs2Consumer.java
@@ -40,6 +40,8 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;
import org.apache.camel.AsyncCallback;
@@ -484,7 +486,7 @@ public class Sqs2Consumer extends ScheduledBatchPollingConsumer {
* means there is no schedule.
*/
private final AtomicLong queueAutoCreationScheduleTime = new AtomicLong(0L);
- private final Object mutex = new Object();
+ private final Lock lock = new ReentrantLock();
private final AtomicBoolean closed = new AtomicBoolean();
private final Clock clock;
@@ -630,7 +632,8 @@ public class Sqs2Consumer extends ScheduledBatchPollingConsumer {
}
private void createQueue(UUID requestId, PollingContext context) {
- synchronized (mutex) {
+ lock.lock();
+ try {
if (isClosed() || context.isMissingQueueHandledInAnotherRequest(requestId)) {
// the missing queue error can be thrown by multiple threads
// the first thread that is handling the error should prevent other threads
@@ -648,6 +651,8 @@ public class Sqs2Consumer extends ScheduledBatchPollingConsumer {
LOG.error("Error while creating queue.", e);
context.firePollingError(e);
}
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java
index 4cd04ab2b37..53f18b4855f 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java
@@ -30,6 +30,8 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.camel.Body;
import org.apache.camel.CamelContext;
@@ -55,6 +57,7 @@ public abstract class AbstractCamelInvocationHandler implements InvocationHandle
private static final Logger LOG = LoggerFactory.getLogger(AbstractCamelInvocationHandler.class);
private static final List<Method> EXCLUDED_METHODS = new ArrayList<>();
+ private static final Lock LOCK = new ReentrantLock();
public static final String CAMEL_INVOCATION_HANDLER = "CamelInvocationHandler";
private static ExecutorService executorService;
protected final Endpoint endpoint;
@@ -289,24 +292,29 @@ public abstract class AbstractCamelInvocationHandler implements InvocationHandle
}
}
- protected static synchronized ExecutorService getExecutorService(CamelContext context) {
- // CamelContext will shutdown thread pool when it shutdown so we can
- // lazy create it on demand
- // but in case of hot-deploy or the likes we need to be able to
- // re-create it (its a shared static instance)
- if (executorService == null || executorService.isTerminated() || executorService.isShutdown()) {
- // try to lookup a pool first based on id/profile
- executorService = context.getRegistry().lookupByNameAndType(CAMEL_INVOCATION_HANDLER, ExecutorService.class);
- if (executorService == null) {
- executorService = context.getExecutorServiceManager().newThreadPool(CamelInvocationHandler.class,
- CAMEL_INVOCATION_HANDLER, CAMEL_INVOCATION_HANDLER);
- }
- if (executorService == null) {
- executorService = context.getExecutorServiceManager().newDefaultThreadPool(CamelInvocationHandler.class,
- CAMEL_INVOCATION_HANDLER);
+ protected static ExecutorService getExecutorService(CamelContext context) {
+ LOCK.lock();
+ try {
+ // CamelContext will shutdown thread pool when it shutdown so we can
+ // lazy create it on demand
+ // but in case of hot-deploy or the likes we need to be able to
+ // re-create it (its a shared static instance)
+ if (executorService == null || executorService.isTerminated() || executorService.isShutdown()) {
+ // try to lookup a pool first based on id/profile
+ executorService = context.getRegistry().lookupByNameAndType(CAMEL_INVOCATION_HANDLER, ExecutorService.class);
+ if (executorService == null) {
+ executorService = context.getExecutorServiceManager()
+ .newThreadPool(CamelInvocationHandler.class, CAMEL_INVOCATION_HANDLER, CAMEL_INVOCATION_HANDLER);
+ }
+ if (executorService == null) {
+ executorService = context.getExecutorServiceManager()
+ .newDefaultThreadPool(CamelInvocationHandler.class, CAMEL_INVOCATION_HANDLER);
+ }
}
+ return executorService;
+ } finally {
+ LOCK.unlock();
}
- return executorService;
}
/**
diff --git a/components/camel-box/camel-box-component/src/main/java/org/apache/camel/component/box/internal/BoxPropertiesHelper.java b/components/camel-box/camel-box-component/src/main/java/org/apache/camel/component/box/internal/BoxPropertiesHelper.java
index ee129383351..4f559df9c2e 100644
--- a/components/camel-box/camel-box-component/src/main/java/org/apache/camel/component/box/internal/BoxPropertiesHelper.java
+++ b/components/camel-box/camel-box-component/src/main/java/org/apache/camel/component/box/internal/BoxPropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.box.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.box.BoxConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class BoxPropertiesHelper extends ApiMethodPropertiesHelper<BoxConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static BoxPropertiesHelper helper;
private BoxPropertiesHelper(CamelContext context) {
super(context, BoxConfiguration.class, BoxConstants.PROPERTY_PREFIX);
}
- public static synchronized BoxPropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new BoxPropertiesHelper(context);
+ public static BoxPropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new BoxPropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
index c53a93ff466..4e7bae5a481 100644
--- a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
+++ b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/BraintreeConfiguration.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.component.braintree;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -68,6 +70,7 @@ public class BraintreeConfiguration {
private boolean logHandlerEnabled = true;
@UriParam(label = "advanced")
private Integer httpReadTimeout;
+ private final Lock lock = new ReentrantLock();
public BraintreeApiName getApiName() {
return apiName;
@@ -239,50 +242,49 @@ public class BraintreeConfiguration {
/**
* Construct a BraintreeGateway from configuration
*/
- synchronized BraintreeGateway newBraintreeGateway() {
- final BraintreeGateway gateway;
-
- if (accessToken != null) {
- gateway = new BraintreeGateway(
- accessToken);
- setEnvironment(gateway.getConfiguration().getEnvironment().getEnvironmentName());
- } else {
- gateway = new BraintreeGateway(
- getBraintreeEnvironment(),
- getMerchantId(),
- getPublicKey(),
- getPrivateKey());
+ BraintreeGateway newBraintreeGateway() {
+ lock.lock();
+ try {
+ final BraintreeGateway gateway;
+
+ if (accessToken != null) {
+ gateway = new BraintreeGateway(accessToken);
+ setEnvironment(gateway.getConfiguration().getEnvironment().getEnvironmentName());
+ } else {
+ gateway = new BraintreeGateway(getBraintreeEnvironment(), getMerchantId(), getPublicKey(), getPrivateKey());
+ }
+
+ if (ObjectHelper.isNotEmpty(proxyHost) && ObjectHelper.isNotEmpty(proxyPort)) {
+ gateway.setProxy(proxyHost, proxyPort);
+ }
+
+ if (httpReadTimeout != null) {
+ gateway.getConfiguration().setTimeout(httpReadTimeout);
+ }
+
+ // If custom log name is defined, a new logger wil be requested otherwise
+ // the one supplied by Braintree' SDK will be used
+ final Logger logger = ObjectHelper.isNotEmpty(httpLogName)
+ ? Logger.getLogger(httpLogName) : gateway.getConfiguration().getLogger();
+
+ // Cleanup handlers as by default braintree install a ConsoleHandler
+ for (Handler handler : logger.getHandlers()) {
+ logger.removeHandler(handler);
+ }
+
+ if (isLogHandlerEnabled()) {
+ logger.addHandler(new BraintreeLogHandler());
+ }
+
+ if (httpLogLevel != null) {
+ logger.setLevel(Level.parse(httpLogLevel));
+ }
+
+ gateway.getConfiguration().setLogger(logger);
+
+ return gateway;
+ } finally {
+ lock.unlock();
}
-
- if (ObjectHelper.isNotEmpty(proxyHost) && ObjectHelper.isNotEmpty(proxyPort)) {
- gateway.setProxy(proxyHost, proxyPort);
- }
-
- if (httpReadTimeout != null) {
- gateway.getConfiguration().setTimeout(httpReadTimeout);
- }
-
- // If custom log name is defined, a new logger wil be requested otherwise
- // the one supplied by Braintree' SDK will be used
- final Logger logger = ObjectHelper.isNotEmpty(httpLogName)
- ? Logger.getLogger(httpLogName)
- : gateway.getConfiguration().getLogger();
-
- // Cleanup handlers as by default braintree install a ConsoleHandler
- for (Handler handler : logger.getHandlers()) {
- logger.removeHandler(handler);
- }
-
- if (isLogHandlerEnabled()) {
- logger.addHandler(new BraintreeLogHandler());
- }
-
- if (httpLogLevel != null) {
- logger.setLevel(Level.parse(httpLogLevel));
- }
-
- gateway.getConfiguration().setLogger(logger);
-
- return gateway;
}
}
diff --git a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/internal/BraintreePropertiesHelper.java b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/internal/BraintreePropertiesHelper.java
index 25c1aa524f4..e5569e6e603 100644
--- a/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/internal/BraintreePropertiesHelper.java
+++ b/components/camel-braintree/src/main/java/org/apache/camel/component/braintree/internal/BraintreePropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.braintree.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.braintree.BraintreeConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class BraintreePropertiesHelper extends ApiMethodPropertiesHelper<BraintreeConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static BraintreePropertiesHelper helper;
private BraintreePropertiesHelper(CamelContext context) {
super(context, BraintreeConfiguration.class, BraintreeConstants.PROPERTY_PREFIX);
}
- public static synchronized BraintreePropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new BraintreePropertiesHelper(context);
+ public static BraintreePropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new BraintreePropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
index d317d1f05c7..48971ebc930 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
@@ -64,35 +64,40 @@ public class CoAPComponent extends DefaultComponent implements RestConsumerFacto
public CoAPComponent() {
}
- public synchronized CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException, GeneralSecurityException {
- CoapServer server = servers.get(port);
- if (server == null && port == -1) {
- server = getServer(DEFAULT_PORT, endpoint);
- }
- if (server == null) {
- CoapEndpoint.Builder coapBuilder = new CoapEndpoint.Builder();
- Configuration config = Configuration.createStandardWithoutFile();
- InetSocketAddress address = new InetSocketAddress(port);
- coapBuilder.setConfiguration(config);
-
- // Configure TLS and / or TCP
- if (CoAPEndpoint.enableDTLS(endpoint.getUri())) {
- doEnableDTLS(endpoint, address, coapBuilder);
- } else if (CoAPEndpoint.enableTCP(endpoint.getUri())) {
- doEnableTCP(endpoint, config, address, coapBuilder);
- } else {
- coapBuilder.setInetSocketAddress(address);
+ public CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException, GeneralSecurityException {
+ lock.lock();
+ try {
+ CoapServer server = servers.get(port);
+ if (server == null && port == -1) {
+ server = getServer(DEFAULT_PORT, endpoint);
}
-
- server = new CoapServer();
- server.addEndpoint(coapBuilder.build());
-
- servers.put(port, server);
- if (this.isStarted()) {
- server.start();
+ if (server == null) {
+ CoapEndpoint.Builder coapBuilder = new CoapEndpoint.Builder();
+ Configuration config = Configuration.createStandardWithoutFile();
+ InetSocketAddress address = new InetSocketAddress(port);
+ coapBuilder.setConfiguration(config);
+
+ // Configure TLS and / or TCP
+ if (CoAPEndpoint.enableDTLS(endpoint.getUri())) {
+ doEnableDTLS(endpoint, address, coapBuilder);
+ } else if (CoAPEndpoint.enableTCP(endpoint.getUri())) {
+ doEnableTCP(endpoint, config, address, coapBuilder);
+ } else {
+ coapBuilder.setInetSocketAddress(address);
+ }
+
+ server = new CoapServer();
+ server.addEndpoint(coapBuilder.build());
+
+ servers.put(port, server);
+ if (this.isStarted()) {
+ server.start();
+ }
}
+ return server;
+ } finally {
+ lock.unlock();
}
- return server;
}
private void doEnableTCP(
diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
index 9fc6b226541..1c51a23c3f6 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java
@@ -80,9 +80,14 @@ public class CoAPProducer extends DefaultProducer {
}
}
- protected synchronized void initClient() throws Exception {
- if (client == null) {
- client = endpoint.createCoapClient(endpoint.getUri());
+ protected void initClient() throws Exception {
+ lock.lock();
+ try {
+ if (client == null) {
+ client = endpoint.createCoapClient(endpoint.getUri());
+ }
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-consul/src/main/java/org/apache/camel/component/consul/ConsulEndpoint.java b/components/camel-consul/src/main/java/org/apache/camel/component/consul/ConsulEndpoint.java
index a9065af8c9f..55c94a14b64 100644
--- a/components/camel-consul/src/main/java/org/apache/camel/component/consul/ConsulEndpoint.java
+++ b/components/camel-consul/src/main/java/org/apache/camel/component/consul/ConsulEndpoint.java
@@ -91,13 +91,18 @@ public class ConsulEndpoint extends DefaultEndpoint {
return this.apiEndpoint;
}
- public synchronized Consul getConsul() throws Exception {
- if (consul == null && ObjectHelper.isEmpty(getConfiguration().getConsulClient())) {
- consul = configuration.createConsulClient(getCamelContext());
- } else if (ObjectHelper.isNotEmpty(getConfiguration().getConsulClient())) {
- consul = getConfiguration().getConsulClient();
+ public Consul getConsul() throws Exception {
+ lock.lock();
+ try {
+ if (consul == null && ObjectHelper.isEmpty(getConfiguration().getConsulClient())) {
+ consul = configuration.createConsulClient(getCamelContext());
+ } else if (ObjectHelper.isNotEmpty(getConfiguration().getConsulClient())) {
+ consul = getConfiguration().getConsulClient();
+ }
+
+ return consul;
+ } finally {
+ lock.unlock();
}
-
- return consul;
}
}
diff --git a/components/camel-controlbus/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java b/components/camel-controlbus/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
index 23d50beb4f2..d9f840f41a9 100644
--- a/components/camel-controlbus/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
+++ b/components/camel-controlbus/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
@@ -48,11 +48,16 @@ public class ControlBusComponent extends DefaultComponent {
return answer;
}
- synchronized ExecutorService getExecutorService() {
- if (executorService == null) {
- executorService = getCamelContext().getExecutorServiceManager().newDefaultThreadPool(this, "ControlBus");
+ ExecutorService getExecutorService() {
+ lock.lock();
+ try {
+ if (executorService == null) {
+ executorService = getCamelContext().getExecutorServiceManager().newDefaultThreadPool(this, "ControlBus");
+ }
+ return executorService;
+ } finally {
+ lock.unlock();
}
- return executorService;
}
@Override
diff --git a/components/camel-dhis2/camel-dhis2-component/src/main/java/org/apache/camel/component/dhis2/internal/Dhis2PropertiesHelper.java b/components/camel-dhis2/camel-dhis2-component/src/main/java/org/apache/camel/component/dhis2/internal/Dhis2PropertiesHelper.java
index 656d419c2aa..d9398111dc1 100644
--- a/components/camel-dhis2/camel-dhis2-component/src/main/java/org/apache/camel/component/dhis2/internal/Dhis2PropertiesHelper.java
+++ b/components/camel-dhis2/camel-dhis2-component/src/main/java/org/apache/camel/component/dhis2/internal/Dhis2PropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.dhis2.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.dhis2.Dhis2Configuration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class Dhis2PropertiesHelper extends ApiMethodPropertiesHelper<Dhis2Configuration> {
+ private static final Lock LOCK = new ReentrantLock();
private static Dhis2PropertiesHelper helper;
private Dhis2PropertiesHelper(CamelContext context) {
super(context, Dhis2Configuration.class, Dhis2Constants.PROPERTY_PREFIX);
}
- public static synchronized Dhis2PropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new Dhis2PropertiesHelper(context);
+ public static Dhis2PropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new Dhis2PropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-dropbox/src/main/java/org/apache/camel/component/dropbox/util/DropboxPropertyManager.java b/components/camel-dropbox/src/main/java/org/apache/camel/component/dropbox/util/DropboxPropertyManager.java
index af17c1fe073..e842d6170d9 100644
--- a/components/camel-dropbox/src/main/java/org/apache/camel/component/dropbox/util/DropboxPropertyManager.java
+++ b/components/camel-dropbox/src/main/java/org/apache/camel/component/dropbox/util/DropboxPropertyManager.java
@@ -20,39 +20,45 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
public final class DropboxPropertyManager {
+ private static final Lock LOCK = new ReentrantLock();
private static Properties properties;
private static DropboxPropertyManager instance;
private DropboxPropertyManager() {
}
- public static synchronized DropboxPropertyManager getInstance() throws Exception {
- if (instance == null) {
- instance = new DropboxPropertyManager();
- properties = loadProperties();
+ public static DropboxPropertyManager getInstance() throws Exception {
+ LOCK.lock();
+ try {
+ if (instance == null) {
+ instance = new DropboxPropertyManager();
+ properties = loadProperties();
+ }
+ return instance;
+ } finally {
+ LOCK.unlock();
}
- return instance;
}
public String getProperty(String key) {
return properties.getProperty(key);
}
- private static Properties loadProperties() throws Exception {
+ private static Properties loadProperties() throws DropboxException {
URL url = DropboxPropertyManager.class.getResource("/dropbox.properties");
-
+ if (url == null) {
+ throw new DropboxException("dropbox.properties could not be found");
+ }
+ Properties properties = new Properties();
try (InputStream inStream = url.openStream()) {
- properties = new Properties();
- try {
- properties.load(inStream);
- } catch (IOException e) {
- throw new DropboxException("dropbox.properties can't be read", e);
- }
+ properties.load(inStream);
} catch (IOException e) {
- throw new DropboxException("dropbox.properties could not be found", e);
+ throw new DropboxException("dropbox.properties can't be read", e);
}
return properties;
diff --git a/components/camel-fhir/camel-fhir-component/src/main/java/org/apache/camel/component/fhir/internal/FhirPropertiesHelper.java b/components/camel-fhir/camel-fhir-component/src/main/java/org/apache/camel/component/fhir/internal/FhirPropertiesHelper.java
index 63e12f164a4..c21f78cbf6f 100644
--- a/components/camel-fhir/camel-fhir-component/src/main/java/org/apache/camel/component/fhir/internal/FhirPropertiesHelper.java
+++ b/components/camel-fhir/camel-fhir-component/src/main/java/org/apache/camel/component/fhir/internal/FhirPropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.fhir.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.fhir.FhirConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class FhirPropertiesHelper extends ApiMethodPropertiesHelper<FhirConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static FhirPropertiesHelper helper;
private FhirPropertiesHelper(CamelContext context) {
super(context, FhirConfiguration.class, FhirConstants.PROPERTY_PREFIX);
}
- public static synchronized FhirPropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new FhirPropertiesHelper(context);
+ public static FhirPropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new FhirPropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-google/camel-google-bigquery/src/main/java/org/apache/camel/component/google/bigquery/GoogleBigQueryConnectionFactory.java b/components/camel-google/camel-google-bigquery/src/main/java/org/apache/camel/component/google/bigquery/GoogleBigQueryConnectionFactory.java
index 2e7c2a596e7..c519ee1eeaa 100644
--- a/components/camel-google/camel-google-bigquery/src/main/java/org/apache/camel/component/google/bigquery/GoogleBigQueryConnectionFactory.java
+++ b/components/camel-google/camel-google-bigquery/src/main/java/org/apache/camel/component/google/bigquery/GoogleBigQueryConnectionFactory.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.google.bigquery;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import com.google.api.client.util.Strings;
import com.google.api.services.bigquery.BigqueryScopes;
@@ -41,6 +43,7 @@ public class GoogleBigQueryConnectionFactory {
private String serviceURL;
private BigQuery client;
private CamelContext camelContext;
+ private final Lock lock = new ReentrantLock();
public GoogleBigQueryConnectionFactory() {
}
@@ -49,11 +52,16 @@ public class GoogleBigQueryConnectionFactory {
this.client = client;
}
- public synchronized BigQuery getDefaultClient() throws Exception {
- if (this.client == null) {
- this.client = buildClient();
+ public BigQuery getDefaultClient() throws Exception {
+ lock.lock();
+ try {
+ if (this.client == null) {
+ this.client = buildClient();
+ }
+ return this.client;
+ } finally {
+ lock.unlock();
}
- return this.client;
}
private BigQuery buildClient() throws Exception {
@@ -133,8 +141,13 @@ public class GoogleBigQueryConnectionFactory {
return this;
}
- private synchronized void resetClient() {
- this.client = null;
+ private void resetClient() {
+ lock.lock();
+ try {
+ this.client = null;
+ } finally {
+ lock.unlock();
+ }
}
public GoogleBigQueryConnectionFactory setCamelContext(CamelContext camelContext) {
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/internal/GoogleCalendarPropertiesHelper.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/internal/GoogleCalendarPropertiesHelper.java
index c6976865761..879adfa8780 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/internal/GoogleCalendarPropertiesHelper.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/internal/GoogleCalendarPropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.google.calendar.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.google.calendar.GoogleCalendarConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class GoogleCalendarPropertiesHelper extends ApiMethodPropertiesHelper<GoogleCalendarConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static GoogleCalendarPropertiesHelper helper;
private GoogleCalendarPropertiesHelper(CamelContext context) {
super(context, GoogleCalendarConfiguration.class, GoogleCalendarConstants.PROPERTY_PREFIX);
}
- public static synchronized GoogleCalendarPropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new GoogleCalendarPropertiesHelper(context);
+ public static GoogleCalendarPropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new GoogleCalendarPropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/internal/GoogleDrivePropertiesHelper.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/internal/GoogleDrivePropertiesHelper.java
index f714287c979..d1c87d39d27 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/internal/GoogleDrivePropertiesHelper.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/internal/GoogleDrivePropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.google.drive.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.google.drive.GoogleDriveConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class GoogleDrivePropertiesHelper extends ApiMethodPropertiesHelper<GoogleDriveConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static GoogleDrivePropertiesHelper helper;
private GoogleDrivePropertiesHelper(CamelContext context) {
super(context, GoogleDriveConfiguration.class, GoogleDriveConstants.PROPERTY_PREFIX);
}
- public static synchronized GoogleDrivePropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new GoogleDrivePropertiesHelper(context);
+ public static GoogleDrivePropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new GoogleDrivePropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/internal/GoogleMailPropertiesHelper.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/internal/GoogleMailPropertiesHelper.java
index c7376bd5eac..2ef381b5146 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/internal/GoogleMailPropertiesHelper.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/internal/GoogleMailPropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.google.mail.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.google.mail.GoogleMailConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class GoogleMailPropertiesHelper extends ApiMethodPropertiesHelper<GoogleMailConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static GoogleMailPropertiesHelper helper;
private GoogleMailPropertiesHelper(CamelContext context) {
super(context, GoogleMailConfiguration.class, GoogleMailConstants.PROPERTY_PREFIX);
}
- public static synchronized GoogleMailPropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new GoogleMailPropertiesHelper(context);
+ public static GoogleMailPropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new GoogleMailPropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/internal/GoogleSheetsPropertiesHelper.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/internal/GoogleSheetsPropertiesHelper.java
index dd8736ed74c..3abfa80f25e 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/internal/GoogleSheetsPropertiesHelper.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/internal/GoogleSheetsPropertiesHelper.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.google.sheets.internal;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
import org.apache.camel.CamelContext;
import org.apache.camel.component.google.sheets.GoogleSheetsConfiguration;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;
@@ -25,16 +28,22 @@ import org.apache.camel.support.component.ApiMethodPropertiesHelper;
*/
public final class GoogleSheetsPropertiesHelper extends ApiMethodPropertiesHelper<GoogleSheetsConfiguration> {
+ private static final Lock LOCK = new ReentrantLock();
private static GoogleSheetsPropertiesHelper helper;
private GoogleSheetsPropertiesHelper(CamelContext context) {
super(context, GoogleSheetsConfiguration.class, GoogleSheetsConstants.PROPERTY_PREFIX);
}
- public static synchronized GoogleSheetsPropertiesHelper getHelper(CamelContext context) {
- if (helper == null) {
- helper = new GoogleSheetsPropertiesHelper(context);
+ public static GoogleSheetsPropertiesHelper getHelper(CamelContext context) {
+ LOCK.lock();
+ try {
+ if (helper == null) {
+ helper = new GoogleSheetsPropertiesHelper(context);
+ }
+ return helper;
+ } finally {
+ LOCK.unlock();
}
- return helper;
}
}
diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java
index 1a7eaa89502..0956bcb8aba 100644
--- a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java
+++ b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java
@@ -104,13 +104,23 @@ public class HazelcastRoutePolicy extends RoutePolicySupport implements CamelCon
}
@Override
- public synchronized void onStop(Route route) {
- suspendedRoutes.remove(route);
+ public void onStop(Route route) {
+ lock.lock();
+ try {
+ suspendedRoutes.remove(route);
+ } finally {
+ lock.unlock();
+ }
}
@Override
- public synchronized void onSuspend(Route route) {
- suspendedRoutes.remove(route);
+ public void onSuspend(Route route) {
+ lock.lock();
+ try {
+ suspendedRoutes.remove(route);
+ } finally {
+ lock.unlock();
+ }
}
@Override
@@ -165,7 +175,8 @@ public class HazelcastRoutePolicy extends RoutePolicySupport implements CamelCon
}
}
- private synchronized void stopConsumer(Route route) {
+ private void stopConsumer(Route route) {
+ lock.lock();
try {
if (!suspendedRoutes.contains(route)) {
LOGGER.debug("Stopping consumer for {} ({})", route.getId(), route.getConsumer());
@@ -174,10 +185,13 @@ public class HazelcastRoutePolicy extends RoutePolicySupport implements CamelCon
}
} catch (Exception e) {
handleException(e);
+ } finally {
+ lock.unlock();
}
}
- private synchronized void startAllStoppedConsumers() {
+ private void startAllStoppedConsumers() {
+ lock.lock();
try {
for (Route route : suspendedRoutes) {
LOGGER.debug("Starting consumer for {} ({})", route.getId(), route.getConsumer());
@@ -187,6 +201,8 @@ public class HazelcastRoutePolicy extends RoutePolicySupport implements CamelCon
suspendedRoutes.clear();
} catch (Exception e) {
handleException(e);
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpRegistry.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpRegistry.java
index 5bb36576a7b..5b30fe77769 100644
--- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpRegistry.java
+++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpRegistry.java
@@ -16,11 +16,13 @@
*/
package org.apache.camel.http.common;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import jakarta.servlet.Servlet;
@@ -30,9 +32,9 @@ import org.slf4j.LoggerFactory;
public class DefaultHttpRegistry implements HttpRegistry {
private static final Logger LOG = LoggerFactory.getLogger(DefaultHttpRegistry.class);
- private static final Map<String, HttpRegistry> registries = new HashMap<>();
+ private static final Map<String, HttpRegistry> registries = new ConcurrentHashMap<>();
- private final Object lock = new Object();
+ private final Lock lock = new ReentrantLock();
private final Set<HttpConsumer> consumers;
private final Set<HttpRegistryProvider> providers;
@@ -45,20 +47,21 @@ public class DefaultHttpRegistry implements HttpRegistry {
/**
* Lookup or create a new registry if none exists with the given name
*/
- public static synchronized HttpRegistry getHttpRegistry(String name) {
+ public static HttpRegistry getHttpRegistry(String name) {
return registries.computeIfAbsent(name, k -> new DefaultHttpRegistry());
}
/**
* Removes the http registry with the given name
*/
- public static synchronized void removeHttpRegistry(String name) {
+ public static void removeHttpRegistry(String name) {
registries.remove(name);
}
@Override
public void register(HttpConsumer consumer) {
- synchronized (lock) {
+ lock.lock();
+ try {
if (LOG.isDebugEnabled()) {
LOG.debug("Registering consumer for path {} providers present: {}", consumer.getPath(), providers.size());
}
@@ -66,12 +69,15 @@ public class DefaultHttpRegistry implements HttpRegistry {
for (HttpRegistryProvider provider : providers) {
provider.connect(consumer);
}
+ } finally {
+ lock.unlock();
}
}
@Override
public void unregister(HttpConsumer consumer) {
- synchronized (lock) {
+ lock.lock();
+ try {
if (LOG.isDebugEnabled()) {
LOG.debug("Unregistering consumer for path {}", consumer.getPath());
}
@@ -79,6 +85,8 @@ public class DefaultHttpRegistry implements HttpRegistry {
for (HttpRegistryProvider provider : providers) {
provider.disconnect(consumer);
}
+ } finally {
+ lock.unlock();
}
}
@@ -90,7 +98,8 @@ public class DefaultHttpRegistry implements HttpRegistry {
@Override
public void register(HttpRegistryProvider provider) {
- synchronized (lock) {
+ lock.lock();
+ try {
if (LOG.isDebugEnabled()) {
LOG.debug("Registering CamelServlet with name {} consumers present: {}", provider.getServletName(),
consumers.size());
@@ -99,39 +108,50 @@ public class DefaultHttpRegistry implements HttpRegistry {
for (HttpConsumer consumer : consumers) {
provider.connect(consumer);
}
+ } finally {
+ lock.unlock();
}
}
@Override
public void unregister(HttpRegistryProvider provider) {
- synchronized (lock) {
+ lock.lock();
+ try {
if (LOG.isDebugEnabled()) {
LOG.debug("Unregistering CamelServlet with name {}", provider.getServletName());
}
providers.remove(provider);
+ } finally {
+ lock.unlock();
}
}
@Override
public HttpRegistryProvider getCamelServlet(String servletName) {
- synchronized (lock) {
+ lock.lock();
+ try {
for (HttpRegistryProvider provider : providers) {
if (provider.getServletName().equals(servletName)) {
return provider;
}
}
return null;
+ } finally {
+ lock.unlock();
}
}
public void setServlets(List<Servlet> servlets) {
- synchronized (lock) {
+ lock.lock();
+ try {
providers.clear();
for (Servlet servlet : servlets) {
if (servlet instanceof HttpRegistryProvider httpRegistryProvider) {
providers.add(httpRegistryProvider);
}
}
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java
index d6b762eb2ac..d973ef3ca12 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java
@@ -207,18 +207,28 @@ public class HttpEndpoint extends HttpCommonEndpoint {
return answer;
}
- public synchronized HttpClient getHttpClient() {
- if (httpClient == null) {
- httpClient = createHttpClient();
+ public HttpClient getHttpClient() {
+ lock.lock();
+ try {
+ if (httpClient == null) {
+ httpClient = createHttpClient();
+ }
+ return httpClient;
+ } finally {
+ lock.unlock();
}
- return httpClient;
}
/**
* Sets a custom HttpClient to be used by the producer
*/
- public synchronized void setHttpClient(HttpClient httpClient) {
- this.httpClient = httpClient;
+ public void setHttpClient(HttpClient httpClient) {
+ lock.lock();
+ try {
+ this.httpClient = httpClient;
+ } finally {
+ lock.unlock();
+ }
}
/**
diff --git a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractConnectionMultiplexor.java b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractConnectionMultiplexor.java
index fdd9cc12554..5025f11518e 100644
--- a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractConnectionMultiplexor.java
+++ b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractConnectionMultiplexor.java
@@ -16,8 +16,10 @@
*/
package org.apache.camel.component.iec60870;
+import java.util.HashSet;
import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.camel.RuntimeCamelException;
import org.slf4j.Logger;
@@ -38,48 +40,63 @@ public abstract class AbstractConnectionMultiplexor {
}
}
- private final Set<HandleImplementation> handles = new CopyOnWriteArraySet<>();
+ private final Lock lock = new ReentrantLock();
+ private final Set<HandleImplementation> handles = new HashSet<>();
- public synchronized Handle register() throws Exception {
- final HandleImplementation handle = new HandleImplementation();
-
- final boolean needStart = this.handles.isEmpty();
- this.handles.add(handle);
-
- if (needStart) {
- LOG.info("Calling performStart()");
- performStart();
- }
+ public Handle register() throws Exception {
+ lock.lock();
+ try {
+ final HandleImplementation handle = new HandleImplementation();
- return handle;
- }
+ final boolean needStart = this.handles.isEmpty();
+ this.handles.add(handle);
- private synchronized void unregister(final HandleImplementation handle) throws Exception {
- if (!this.handles.remove(handle)) {
- return;
- }
+ if (needStart) {
+ LOG.info("Calling performStart()");
+ performStart();
+ }
- if (this.handles.isEmpty()) {
- LOG.info("Calling performStop()");
- performStop();
+ return handle;
+ } finally {
+ lock.unlock();
}
}
- public synchronized void dispose() {
-
- LOG.info("Disposing");
- if (this.handles.isEmpty()) {
- LOG.debug("Disposing - not started");
- return;
+ private void unregister(final HandleImplementation handle) throws Exception {
+ lock.lock();
+ try {
+ if (!this.handles.remove(handle)) {
+ return;
+ }
+
+ if (this.handles.isEmpty()) {
+ LOG.info("Calling performStop()");
+ performStop();
+ }
+ } finally {
+ lock.unlock();
}
+ }
- LOG.debug("Disposing - calling performStop()");
-
- this.handles.clear();
+ public void dispose() {
+ lock.lock();
try {
- performStop();
- } catch (final Exception e) {
- throw new RuntimeCamelException("Failed to stop on dispose", e);
+ LOG.info("Disposing");
+ if (this.handles.isEmpty()) {
+ LOG.debug("Disposing - not started");
+ return;
+ }
+
+ LOG.debug("Disposing - calling performStop()");
+
+ this.handles.clear();
+ try {
+ performStop();
+ } catch (final Exception e) {
+ throw new RuntimeCamelException("Failed to stop on dispose", e);
+ }
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractIecComponent.java b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractIecComponent.java
index 387f1eca5bb..b78e1c32076 100644
--- a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractIecComponent.java
+++ b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/AbstractIecComponent.java
@@ -133,7 +133,8 @@ public abstract class AbstractIecComponent<T1, T2 extends BaseOptions<T2>> exten
LOG.debug("parse connection - fullUri: {} -> {}", fullUri, id);
- synchronized (this) {
+ lock.lock();
+ try {
LOG.debug("Locating connection - {}", id);
T1 connection = this.connections.get(id);
@@ -148,6 +149,8 @@ public abstract class AbstractIecComponent<T1, T2 extends BaseOptions<T2>> exten
this.connections.put(id, connection);
}
return connection;
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/client/ClientConnection.java b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/client/ClientConnection.java
index d1673f98ecc..09bb01c5d60 100644
--- a/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/client/ClientConnection.java
+++ b/components/camel-iec60870/src/main/java/org/apache/camel/component/iec60870/client/ClientConnection.java
@@ -21,6 +21,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import io.netty.channel.ChannelHandlerContext;
import org.apache.camel.component.iec60870.DiscardAckModule;
@@ -76,6 +78,7 @@ public class ClientConnection {
}
};
+ private final Lock lock = new ReentrantLock();
private final Map<ObjectAddress, Value<?>> lastValue = new HashMap<>();
private final Map<ObjectAddress, ValueListener> listeners = new HashMap<>();
@@ -114,23 +117,33 @@ public class ClientConnection {
this.client.close();
}
- protected synchronized void handleData(final ObjectAddress address, final Value<?> value) {
- this.lastValue.put(address, value);
- final ValueListener listener = this.listeners.get(address);
- if (listener != null) {
- listener.update(address, value);
+ protected void handleData(final ObjectAddress address, final Value<?> value) {
+ lock.lock();
+ try {
+ this.lastValue.put(address, value);
+ final ValueListener listener = this.listeners.get(address);
+ if (listener != null) {
+ listener.update(address, value);
+ }
+ } finally {
+ lock.unlock();
}
}
- public synchronized void setListener(final ObjectAddress address, final ValueListener listener) {
- if (listener != null) {
- this.listeners.put(address, listener);
- final Value<?> last = this.lastValue.get(address);
- if (last != null) {
- listener.update(address, last);
+ public void setListener(final ObjectAddress address, final ValueListener listener) {
+ lock.lock();
+ try {
+ if (listener != null) {
+ this.listeners.put(address, listener);
+ final Value<?> last = this.lastValue.get(address);
+ if (last != null) {
+ listener.update(address, last);
+ }
+ } else {
+ this.listeners.remove(address);
}
- } else {
- this.listeners.remove(address);
+ } finally {
+ lock.unlock();
}
}
diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/cluster/InfinispanEmbeddedClusterView.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/cluster/InfinispanEmbeddedClusterView.java
index 18d9c70f213..4d5d34c6a28 100644
--- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/cluster/InfinispanEmbeddedClusterView.java
+++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/cluster/InfinispanEmbeddedClusterView.java
@@ -198,60 +198,55 @@ public class InfinispanEmbeddedClusterView extends InfinispanClusterView {
((LocalMember) getLocalMember()).setLeader(leader);
}
- private synchronized void run() {
- if (!running.get()) {
- return;
- }
+ private void run() {
+ lock.lock();
+ try {
+ if (!running.get()) {
+ return;
+ }
- final String leaderKey = InfinispanClusterService.LEADER_KEY;
- final String localId = getLocalMember().getId();
+ final String leaderKey = InfinispanClusterService.LEADER_KEY;
+ final String localId = getLocalMember().getId();
- if (isLeader()) {
- LOGGER.debug("Lock refresh key={}, id{}", leaderKey, localId);
+ if (isLeader()) {
+ LOGGER.debug("Lock refresh key={}, id{}", leaderKey, localId);
- // I'm still the leader, so refresh the key so it does not expire.
- if (!cache.replace(
- InfinispanClusterService.LEADER_KEY,
- getClusterService().getId(),
- getClusterService().getId(),
- configuration.getLifespan(),
- configuration.getLifespanTimeUnit())) {
+ // I'm still the leader, so refresh the key so it does not expire.
+ if (!cache.replace(InfinispanClusterService.LEADER_KEY, getClusterService().getId(),
+ getClusterService().getId(), configuration.getLifespan(), configuration.getLifespanTimeUnit())) {
- LOGGER.debug("Failed to refresh the lock key={}, id={}", leaderKey, localId);
+ LOGGER.debug("Failed to refresh the lock key={}, id={}", leaderKey, localId);
- // Looks like I've lost the leadership.
- setLeader(false);
+ // Looks like I've lost the leadership.
+ setLeader(false);
+ }
+ }
+ if (!isLeader()) {
+ LOGGER.debug("Try to acquire lock key={}, id={}", leaderKey, localId);
+
+ Object result = cache.putIfAbsent(InfinispanClusterService.LEADER_KEY, getClusterService().getId(),
+ configuration.getLifespan(), configuration.getLifespanTimeUnit());
+ if (result == null) {
+ LOGGER.debug("Lock acquired key={}, id={}", leaderKey, localId);
+ // Acquired the key so I'm the leader.
+ setLeader(true);
+ } else if (Objects.equals(getClusterService().getId(), result) && !isLeader()) {
+ LOGGER.debug("Lock resumed key={}, id={}", leaderKey, localId);
+ // Hey, I may have recovered from failure (or reboot was really
+ // fast) and my key was still there so yeah, I'm the leader again!
+ setLeader(true);
+ } else {
+ LOGGER.debug("Failed to acquire the lock key={}, id={}", leaderKey, localId);
+ setLeader(false);
+ }
}
- }
- if (!isLeader()) {
- LOGGER.debug("Try to acquire lock key={}, id={}", leaderKey, localId);
- Object result = cache.putIfAbsent(
- InfinispanClusterService.LEADER_KEY,
- getClusterService().getId(),
- configuration.getLifespan(),
+ // refresh local membership
+ cache.put(getLocalMember().getId(), isLeader() ? "true" : "false", configuration.getLifespan(),
configuration.getLifespanTimeUnit());
- if (result == null) {
- LOGGER.debug("Lock acquired key={}, id={}", leaderKey, localId);
- // Acquired the key so I'm the leader.
- setLeader(true);
- } else if (Objects.equals(getClusterService().getId(), result) && !isLeader()) {
- LOGGER.debug("Lock resumed key={}, id={}", leaderKey, localId);
- // Hey, I may have recovered from failure (or reboot was really
- // fast) and my key was still there so yeah, I'm the leader again!
- setLeader(true);
- } else {
- LOGGER.debug("Failed to acquire the lock key={}, id={}", leaderKey, localId);
- setLeader(false);
- }
+ } finally {
+ lock.unlock();
}
-
- // refresh local membership
- cache.put(
- getLocalMember().getId(),
- isLeader() ? "true" : "false",
- configuration.getLifespan(),
- configuration.getLifespanTimeUnit());
}
@CacheEntryRemoved
diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterView.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterView.java
index 31eca6666c5..c05af72d184 100644
--- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterView.java
+++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterView.java
@@ -210,75 +210,68 @@ public class InfinispanRemoteClusterView extends InfinispanClusterView {
((LocalMember) getLocalMember()).setLeader(leader);
}
- private synchronized void run() {
- if (!running.get()) {
- return;
- }
+ private void run() {
+ lock.lock();
+ try {
+ if (!running.get()) {
+ return;
+ }
- final String leaderKey = InfinispanClusterService.LEADER_KEY;
- final String localId = getLocalMember().getId();
+ final String leaderKey = InfinispanClusterService.LEADER_KEY;
+ final String localId = getLocalMember().getId();
- if (isLeader() && version != null) {
- LOGGER.debug("Lock refresh key={}, id{} with version={}", leaderKey, localId, version);
+ if (isLeader() && version != null) {
+ LOGGER.debug("Lock refresh key={}, id{} with version={}", leaderKey, localId, version);
- // I'm still the leader, so refresh the key so it does not expire.
- if (!cache.replaceWithVersion(
- leaderKey,
- getClusterService().getId(),
- version,
- lifespan)) {
+ // I'm still the leader, so refresh the key so it does not expire.
+ if (!cache.replaceWithVersion(leaderKey, getClusterService().getId(), version, lifespan)) {
- LOGGER.debug("Failed to refresh the lock key={}, id={}, version={}", leaderKey, localId, version);
+ LOGGER.debug("Failed to refresh the lock key={}, id={}, version={}", leaderKey, localId, version);
- setLeader(false);
- } else {
- version = cache.getWithMetadata(leaderKey).getVersion();
+ setLeader(false);
+ } else {
+ version = cache.getWithMetadata(leaderKey).getVersion();
- LOGGER.debug("Lock refreshed key={}, ud={}, with new version={}", leaderKey, localId, version);
+ LOGGER.debug("Lock refreshed key={}, ud={}, with new version={}", leaderKey, localId, version);
+ }
}
- }
-
- if (!isLeader()) {
- LOGGER.debug("Try to acquire lock key={}, id={}", leaderKey, localId);
- Object result = cache.withFlags(Flag.FORCE_RETURN_VALUE)
- .putIfAbsent(
- leaderKey,
- localId,
- configuration.getLifespan(),
- configuration.getLifespanTimeUnit());
+ if (!isLeader()) {
+ LOGGER.debug("Try to acquire lock key={}, id={}", leaderKey, localId);
- if (result == null) {
- // Acquired the key so I'm the leader.
- setLeader(true);
+ Object result = cache.withFlags(Flag.FORCE_RETURN_VALUE)
+ .putIfAbsent(leaderKey, localId, configuration.getLifespan(), configuration.getLifespanTimeUnit());
- // Get the version
- version = cache.getWithMetadata(leaderKey).getVersion();
+ if (result == null) {
+ // Acquired the key so I'm the leader.
+ setLeader(true);
- LOGGER.debug("Lock acquired key={}, id={}, with version={}", leaderKey, localId, version);
+ // Get the version
+ version = cache.getWithMetadata(leaderKey).getVersion();
- } else if (Objects.equals(getClusterService().getId(), result) && !isLeader()) {
- // Hey, I may have recovered from failure (or reboot was really
- // fast) and my key was still there so yeah, I'm the leader again!
- setLeader(true);
+ LOGGER.debug("Lock acquired key={}, id={}, with version={}", leaderKey, localId, version);
+ } else if (Objects.equals(getClusterService().getId(), result) && !isLeader()) {
+ // Hey, I may have recovered from failure (or reboot was really
+ // fast) and my key was still there so yeah, I'm the leader again!
+ setLeader(true);
- // Get the version
- version = cache.getWithMetadata(leaderKey).getVersion();
+ // Get the version
+ version = cache.getWithMetadata(leaderKey).getVersion();
- LOGGER.debug("Lock resumed key={}, id={} with version={}", leaderKey, localId, version);
- } else {
- LOGGER.debug("Failed to acquire the lock key={}, id={}", leaderKey, localId);
+ LOGGER.debug("Lock resumed key={}, id={} with version={}", leaderKey, localId, version);
+ } else {
+ LOGGER.debug("Failed to acquire the lock key={}, id={}", leaderKey, localId);
- setLeader(false);
+ setLeader(false);
+ }
}
- }
- // refresh local membership
- cache.put(
- getLocalMember().getId(),
- isLeader() ? "true" : "false",
- configuration.getLifespan(),
- configuration.getLifespanTimeUnit());
+ // refresh local membership
+ cache.put(getLocalMember().getId(), isLeader() ? "true" : "false", configuration.getLifespan(),
+ configuration.getLifespanTimeUnit());
+ } finally {
+ lock.unlock();
+ }
}
@ClientCacheEntryRemoved
diff --git a/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java b/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java
index 3e07f097df8..ef61d2fdf28 100644
--- a/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java
+++ b/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java
@@ -58,25 +58,35 @@ public class IrcComponent extends DefaultComponent implements SSLContextParamete
return endpoint;
}
- public synchronized IRCConnection getIRCConnection(IrcConfiguration configuration) {
- final IRCConnection connection;
- if (connectionCache.containsKey(configuration.getCacheKey())) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Returning Cached Connection to {}:{}", configuration.getHostname(), configuration.getNickname());
+ public IRCConnection getIRCConnection(IrcConfiguration configuration) {
+ lock.lock();
+ try {
+ final IRCConnection connection;
+ if (connectionCache.containsKey(configuration.getCacheKey())) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Returning Cached Connection to {}:{}", configuration.getHostname(), configuration.getNickname());
+ }
+ connection = connectionCache.get(configuration.getCacheKey());
+ } else {
+ connection = createConnection(configuration);
+ connectionCache.put(configuration.getCacheKey(), connection);
}
- connection = connectionCache.get(configuration.getCacheKey());
- } else {
- connection = createConnection(configuration);
- connectionCache.put(configuration.getCacheKey(), connection);
+ return connection;
+ } finally {
+ lock.unlock();
}
- return connection;
}
- public synchronized void closeIRCConnection(IrcConfiguration configuration) {
- IRCConnection connection = connectionCache.get(configuration.getCacheKey());
- if (connection != null) {
- closeConnection(connection);
- connectionCache.remove(configuration.getCacheKey());
+ public void closeIRCConnection(IrcConfiguration configuration) {
+ lock.lock();
+ try {
+ IRCConnection connection = connectionCache.get(configuration.getCacheKey());
+ if (connection != null) {
+ closeConnection(connection);
+ connectionCache.remove(configuration.getCacheKey());
+ }
+ } finally {
+ lock.unlock();
}
}
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/utils/extensions/JmsServiceExtension.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/utils/extensions/JmsServiceExtension.java
index f4b5f035002..e1bad67eb2a 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/utils/extensions/JmsServiceExtension.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/utils/extensions/JmsServiceExtension.java
@@ -18,6 +18,8 @@ package org.apache.camel.itest.utils.extensions;
import java.io.File;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.JMSException;
@@ -39,7 +41,7 @@ import static org.junit.jupiter.api.Assertions.fail;
public final class JmsServiceExtension implements Extension {
private static final Logger LOG = LoggerFactory.getLogger(JmsServiceExtension.class);
-
+ private static final Lock LOCK = new ReentrantLock();
private static JmsServiceExtension instance;
private final JmsComponent amq;
@@ -84,16 +86,21 @@ public final class JmsServiceExtension implements Extension {
return amq;
}
- public static synchronized JmsServiceExtension createExtension() {
- if (instance == null) {
- try {
- instance = new JmsServiceExtension();
- } catch (JMSException e) {
- LOG.error("Unable to create JMS connection: {}", e.getMessage(), e);
- fail(String.format("Unable to create JMS connection: %s", e.getMessage()));
+ public static JmsServiceExtension createExtension() {
+ LOCK.lock();
+ try {
+ if (instance == null) {
+ try {
+ instance = new JmsServiceExtension();
+ } catch (JMSException e) {
+ LOG.error("Unable to create JMS connection: {}", e.getMessage(), e);
+ fail(String.format("Unable to create JMS connection: %s", e.getMessage()));
+ }
}
- }
- return instance;
+ return instance;
+ } finally {
+ LOCK.unlock();
+ }
}
}