You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2021/12/20 19:22:50 UTC
[activemq-artemis] branch main updated: ARTEMIS-3618 Faster Artemis CORE client MessageListener::onMessage without SecurityManager
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 <ni...@gmail.com>
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