Skip to content

Commit

Permalink
ARTEMIS-3618 Faster Artemis CORE client MessageListener::onMessage wi…
Browse files Browse the repository at this point in the history
…thout SecurityManager
  • Loading branch information
franz1981 authored and clebertsuconic committed Dec 20, 2021
1 parent 2e3c69c commit 46d1fa6
Showing 1 changed file with 42 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -997,29 +996,14 @@ private void callOnMessage() throws Exception {
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);
}
Expand All @@ -1046,6 +1030,45 @@ public Object run() {
}
}

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
Expand Down

0 comments on commit 46d1fa6

Please sign in to comment.