This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 46d1fa6 ARTEMIS-3618 Faster Artemis CORE client
MessageListener::onMessage without SecurityManager
46d1fa6 is described below
commit 46d1fa66f7bd824038ba32ee08d651f06bff12f3
Author: franz1981 <[email protected]>
AuthorDate: Mon Dec 20 15:23:47 2021 +0100
ARTEMIS-3618 Faster Artemis CORE client MessageListener::onMessage without
SecurityManager
---
.../core/client/impl/ClientConsumerImpl.java | 61 +++++++++++++++-------
1 file changed, 42 insertions(+), 19 deletions(-)
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
index 5000159..c4723f1 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
@@ -20,6 +20,7 @@ import java.io.File;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
+import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
@@ -131,8 +132,6 @@ public final class ClientConsumerImpl implements
ClientConsumerInternal {
private final ClassLoader contextClassLoader;
-
-
public ClientConsumerImpl(final ClientSessionInternal session,
final ConsumerContext consumerContext,
final SimpleString queueName,
@@ -997,29 +996,14 @@ public final class ClientConsumerImpl implements
ClientConsumerInternal {
if (logger.isTraceEnabled()) {
logger.trace(this + "::Calling handler.onMessage");
}
- final ClassLoader originalLoader =
AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
- @Override
- public ClassLoader run() {
- ClassLoader originalLoader =
Thread.currentThread().getContextClassLoader();
-
-
Thread.currentThread().setContextClassLoader(contextClassLoader);
-
- return originalLoader;
- }
- });
+ final ClassLoader originalLoader =
safeInstallContextClassLoader();
onMessageThread = Thread.currentThread();
try {
theHandler.onMessage(message);
} finally {
try {
- AccessController.doPrivileged(new
PrivilegedAction<Object>() {
- @Override
- public Object run() {
-
Thread.currentThread().setContextClassLoader(originalLoader);
- return null;
- }
- });
+ safeRestoreContextClassLoader(originalLoader);
} catch (Exception e) {
ActiveMQClientLogger.LOGGER.failedPerformPostActionsOnMessage(e);
}
@@ -1046,6 +1030,45 @@ public final class ClientConsumerImpl implements
ClientConsumerInternal {
}
}
+ private ClassLoader unsafeInstallContextClassLoader() {
+ final Thread currentThread = Thread.currentThread();
+ final ClassLoader originalCl = currentThread.getContextClassLoader();
+ if (Objects.equals(originalCl, contextClassLoader)) {
+ return originalCl;
+ }
+ currentThread.setContextClassLoader(contextClassLoader);
+ return originalCl;
+ }
+
+ private ClassLoader safeInstallContextClassLoader() {
+ if (System.getSecurityManager() == null) {
+ try {
+ return unsafeInstallContextClassLoader();
+ } catch (SecurityException ignored) {
+ // racy security manager set
+ }
+ }
+ return AccessController.doPrivileged((PrivilegedAction<ClassLoader>)
this::unsafeInstallContextClassLoader);
+ }
+
+ private void safeRestoreContextClassLoader(final ClassLoader
originalClassLoader) {
+ if (Objects.equals(originalClassLoader, contextClassLoader)) {
+ return;
+ }
+ if (System.getSecurityManager() == null) {
+ try {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ return;
+ } catch (SecurityException ignored) {
+ // racy security manager set
+ }
+ }
+ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ return null;
+ });
+ }
+
/**
* @param message
* @throws ActiveMQException