Skip to content

Commit

Permalink
ARTEMIS-2111 ManagementContext can leak
Browse files Browse the repository at this point in the history
(cherry picked from commit 744838f)
  • Loading branch information
jbertram authored and clebertsuconic committed Oct 11, 2018
1 parent 01c50e1 commit 70a70f4
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 26 deletions.
6 changes: 6 additions & 0 deletions artemis-cli/pom.xml
Expand Up @@ -146,6 +146,12 @@
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>artemis-junit</artifactId>
<version>2.7.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Expand Up @@ -22,12 +22,14 @@

import io.airlift.airline.Command;
import io.airlift.airline.Option;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.cli.Artemis;
import org.apache.activemq.artemis.cli.commands.tools.LockAbstract;
import org.apache.activemq.artemis.cli.factory.BrokerFactory;
import org.apache.activemq.artemis.cli.factory.jmx.ManagementFactory;
import org.apache.activemq.artemis.cli.factory.security.SecurityManagerFactory;
import org.apache.activemq.artemis.components.ExternalComponent;
import org.apache.activemq.artemis.core.server.ActivateCallback;
import org.apache.activemq.artemis.core.server.management.ManagementContext;
import org.apache.activemq.artemis.dto.BrokerDTO;
import org.apache.activemq.artemis.dto.ComponentDTO;
Expand Down Expand Up @@ -65,34 +67,49 @@ public static void setEmbedded(boolean embedded) {
public Object execute(ActionContext context) throws Exception {
super.execute(context);

ManagementContextDTO managementDTO = getManagementDTO();
managementContext = ManagementFactory.create(managementDTO);
try {
ManagementContextDTO managementDTO = getManagementDTO();
managementContext = ManagementFactory.create(managementDTO);

Artemis.printBanner();
Artemis.printBanner();

BrokerDTO broker = getBrokerDTO();
BrokerDTO broker = getBrokerDTO();

addShutdownHook(broker.server.getConfigurationFile().getParentFile());
addShutdownHook(broker.server.getConfigurationFile().getParentFile());

ActiveMQSecurityManager security = SecurityManagerFactory.create(broker.security);
ActiveMQSecurityManager security = SecurityManagerFactory.create(broker.security);

server = BrokerFactory.createServer(broker.server, security);
server = BrokerFactory.createServer(broker.server, security);

managementContext.start();
server.start();
managementContext.start();
server.start();
server.getServer().registerActivateCallback(new ActivateCallback() {
@Override
public void deActivate() {
try {
managementContext.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
});

if (broker.web != null) {
broker.components.add(broker.web);
}
if (broker.web != null) {
broker.components.add(broker.web);
}

for (ComponentDTO componentDTO : broker.components) {
Class clazz = this.getClass().getClassLoader().loadClass(componentDTO.componentClassName);
ExternalComponent component = (ExternalComponent) clazz.newInstance();
component.configure(componentDTO, getBrokerInstance(), getBrokerHome());
component.start();
server.getServer().addExternalComponent(component);
for (ComponentDTO componentDTO : broker.components) {
Class clazz = this.getClass().getClassLoader().loadClass(componentDTO.componentClassName);
ExternalComponent component = (ExternalComponent) clazz.newInstance();
component.configure(componentDTO, getBrokerInstance(), getBrokerHome());
component.start();
server.getServer().addExternalComponent(component);
}
} catch (Throwable t) {
t.printStackTrace();
stop();
}
return null;
return new Pair<>(managementContext, server.getServer());
}

/**
Expand Down Expand Up @@ -155,7 +172,9 @@ public void run() {

protected void stop() {
try {
server.stop(true);
if (server != null) {
server.stop(true);
}
if (managementContext != null) {
managementContext.stop();
}
Expand Down
Expand Up @@ -36,6 +36,7 @@
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
Expand All @@ -55,10 +56,13 @@
import org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl;
import org.apache.activemq.artemis.core.config.FileDeploymentManager;
import org.apache.activemq.artemis.core.config.impl.FileConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.management.ManagementContext;
import org.apache.activemq.artemis.jlibaio.LibaioContext;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
import org.apache.activemq.artemis.junit.Wait;
import org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec;
import org.apache.activemq.artemis.utils.HashProcessor;
import org.apache.activemq.artemis.utils.PasswordMaskingUtil;
Expand Down Expand Up @@ -233,6 +237,21 @@ public void testWebConfig() throws Exception {
assertEquals("password2", trustPass);
}

@Test
public void testStopManagementContext() throws Exception {
Run.setEmbedded(true);
File instance1 = new File(temporaryFolder.getRoot(), "instance_user");
System.setProperty("java.security.auth.login.config", instance1.getAbsolutePath() + "/etc/login.config");
Artemis.main("create", instance1.getAbsolutePath(), "--silent", "--no-autotune", "--no-web", "--no-amqp-acceptor", "--no-mqtt-acceptor", "--no-stomp-acceptor", "--no-hornetq-acceptor");
System.setProperty("artemis.instance", instance1.getAbsolutePath());
Object result = Artemis.internalExecute("run");
ManagementContext managementContext = ((Pair<ManagementContext, ActiveMQServer>)result).getA();
ActiveMQServer activeMQServer = ((Pair<ManagementContext, ActiveMQServer>)result).getB();
activeMQServer.stop();
assertTrue(Wait.waitFor(() -> managementContext.isStarted() == false, 5000, 200));
stopServer();
}

@Test
public void testUserCommand() throws Exception {
Run.setEmbedded(true);
Expand Down
Expand Up @@ -17,11 +17,13 @@
package org.apache.activemq.artemis.core.server.management;


import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.activemq.artemis.core.config.JMXConnectorConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;

public class ManagementContext implements ActiveMQComponent {
private boolean isStarted = false;
private AtomicBoolean isStarted = new AtomicBoolean(false);
private JMXAccessControlList accessControlList;
private JMXConnectorConfiguration jmxConnectorConfiguration;
private ManagementConnector mBeanServer;
Expand All @@ -40,20 +42,21 @@ public void start() throws Exception {
mBeanServer = new ManagementConnector(jmxConnectorConfiguration);
mBeanServer.start();
}
isStarted = true;
isStarted.set(true);
}

@Override
public void stop() throws Exception {
isStarted = false;
if (mBeanServer != null) {
mBeanServer.stop();
if (isStarted.getAndSet(false)) {
if (mBeanServer != null) {
mBeanServer.stop();
}
}
}

@Override
public boolean isStarted() {
return isStarted;
return isStarted.get();
}

public void setAccessControlList(JMXAccessControlList accessControlList) {
Expand Down

0 comments on commit 70a70f4

Please sign in to comment.