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