聊聊artemis的gracefulShutdownEnabled

编程

gracefulShutdownEnabled

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java

public class ConfigurationImpl implements Configuration, Serializable {

//......

private boolean gracefulShutdownEnabled = ActiveMQDefaultConfiguration.isDefaultGracefulShutdownEnabled();

private long gracefulShutdownTimeout = ActiveMQDefaultConfiguration.getDefaultGracefulShutdownTimeout();

//......

@Override

public boolean isGracefulShutdownEnabled() {

return gracefulShutdownEnabled;

}

@Override

public ConfigurationImpl setGracefulShutdownEnabled(final boolean enabled) {

gracefulShutdownEnabled = enabled;

return this;

}

@Override

public long getGracefulShutdownTimeout() {

return gracefulShutdownTimeout;

}

@Override

public ConfigurationImpl setGracefulShutdownTimeout(final long timeout) {

gracefulShutdownTimeout = timeout;

return this;

}

//......

}

  • ConfigurationImpl定义了两个关于gracefulShutdown的属性,分别是gracefulShutdownEnabled(默认为true)及gracefulShutdownTimeout(默认为-1)

ActiveMQServerImpl

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java

public class ActiveMQServerImpl implements ActiveMQServer {

//......

public final void stop(boolean failoverOnServerShutdown, boolean isExit) throws Exception {

stop(failoverOnServerShutdown, false, false, isExit);

}

public void stop(boolean failoverOnServerShutdown, final boolean criticalIOError, boolean restarting) {

this.stop(failoverOnServerShutdown, criticalIOError, restarting, false);

}

void stop(boolean failoverOnServerShutdown, final boolean criticalIOError, boolean restarting, boolean isShutdown) {

logger.debug("Stopping server");

synchronized (this) {

if (state == SERVER_STATE.STOPPED || state == SERVER_STATE.STOPPING) {

return;

}

state = SERVER_STATE.STOPPING;

if (fileStoreMonitor != null) {

fileStoreMonitor.stop();

fileStoreMonitor = null;

}

if (failoverOnServerShutdown) {

activation.sendLiveIsStopping();

}

stopComponent(connectorsService);

// we stop the groupingHandler before we stop the cluster manager so binding mappings

// aren"t removed in case of failover

if (groupingHandler != null) {

managementService.removeNotificationListener(groupingHandler);

stopComponent(groupingHandler);

}

stopComponent(federationManager);

stopComponent(clusterManager);

if (remotingService != null) {

remotingService.pauseAcceptors();

}

// allows for graceful shutdown

if (remotingService != null && configuration.isGracefulShutdownEnabled()) {

long timeout = configuration.getGracefulShutdownTimeout();

try {

if (timeout == -1) {

remotingService.getConnectionCountLatch().await();

} else {

remotingService.getConnectionCountLatch().await(timeout);

}

} catch (InterruptedException e) {

ActiveMQServerLogger.LOGGER.interruptWhilstStoppingComponent(remotingService.getClass().getName());

}

}

freezeConnections();

}

//......

}

static void stopComponent(ActiveMQComponent component) {

try {

if (component != null) {

component.stop();

}

} catch (Throwable t) {

ActiveMQServerLogger.LOGGER.errorStoppingComponent(t, component.getClass().getName());

}

}

//......

}

  • ActiveMQServerImpl在remotingService不为null且configuration.isGracefulShutdownEnabled()为true时会读取configuration.getGracefulShutdownTimeout();若timeout为-1,则执行remotingService.getConnectionCountLatch().await(),否则执行remotingService.getConnectionCountLatch().await(timeout)

connectionCountLatch

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java

public class RemotingServiceImpl implements RemotingService, ServerConnectionLifeCycleListener {

//......

private final ReusableLatch connectionCountLatch = new ReusableLatch(0);

//......

public synchronized ReusableLatch getConnectionCountLatch() {

return connectionCountLatch;

}

public void connectionCreated(final ActiveMQComponent component,

final Connection connection,

final ProtocolManager protocol) {

if (server == null) {

throw new IllegalStateException("Unable to create connection, server hasn"t finished starting up");

}

ConnectionEntry entry = protocol.createConnectionEntry((Acceptor) component, connection);

try {

if (server.hasBrokerConnectionPlugins()) {

server.callBrokerConnectionPlugins(plugin -> plugin.afterCreateConnection(entry.connection));

}

} catch (ActiveMQException t) {

logger.warn("Error executing afterCreateConnection plugin method: {}", t.getMessage(), t);

throw new IllegalStateException(t.getMessage(), t.getCause());

}

if (logger.isTraceEnabled()) {

logger.trace("Connection created " + connection);

}

connections.put(connection.getID(), entry);

connectionCountLatch.countUp();

totalConnectionCount.incrementAndGet();

}

public RemotingConnection removeConnection(final Object remotingConnectionID) {

ConnectionEntry entry = connections.remove(remotingConnectionID);

if (entry != null) {

logger.debug("RemotingServiceImpl::removing connection ID " + remotingConnectionID);

connectionCountLatch.countDown();

return entry.connection;

} else {

logger.debug("The connectionID::" + remotingConnectionID + " was already removed by some other module");

return null;

}

}

//......

}

  • getConnectionCountLatch返回的是connectionCountLatch;connectionCreated方法会执行connectionCountLatch.countUp();removeConnection方法会执行connectionCountLatch.countDown()

小结

ConfigurationImpl定义了两个关于gracefulShutdown的属性,分别是gracefulShutdownEnabled(默认为true)及gracefulShutdownTimeout(默认为-1);ActiveMQServerImpl在remotingService不为null且configuration.isGracefulShutdownEnabled()为true时会读取configuration.getGracefulShutdownTimeout();若timeout为-1,则执行remotingService.getConnectionCountLatch().await(),否则执行remotingService.getConnectionCountLatch().await(timeout)

doc

  • ConfigurationImpl

以上是 聊聊artemis的gracefulShutdownEnabled 的全部内容, 来源链接: utcz.com/z/512842.html

回到顶部