diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-12-07 21:19:21 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-12-07 21:19:21 +0000 |
| commit | b1e8d83ef545719e5a39d50726d977b5f747a245 (patch) | |
| tree | 799876ee60fbf4ea7d00ca0ba9f6453261315635 /qpid/java | |
| parent | db07194fdec1c2c27d9de2fdc881e5d8e7b3ead9 (diff) | |
| download | qpid-python-b1e8d83ef545719e5a39d50726d977b5f747a245.tar.gz | |
QPID-6263 : [Java Broker] Move startup/recovery logic from server.Broker to SystemConfig
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1643719 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
9 files changed, 152 insertions, 117 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java index 3b899e3dd3..e187b32694 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java @@ -33,11 +33,9 @@ import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; -import org.apache.qpid.common.QpidProperties; import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; -import org.apache.qpid.server.logging.CompositeStartupMessageLogger; import org.apache.qpid.server.logging.EventLogger; import org.apache.qpid.server.logging.Log4jMessageLogger; import org.apache.qpid.server.logging.LogRecorder; @@ -46,14 +44,11 @@ import org.apache.qpid.server.logging.SystemOutMessageLogger; import org.apache.qpid.server.logging.log4j.LoggingManagementFacade; import org.apache.qpid.server.logging.messages.BrokerMessages; import org.apache.qpid.server.model.BrokerShutdownProvider; -import org.apache.qpid.server.model.State; import org.apache.qpid.server.model.SystemConfig; import org.apache.qpid.server.plugin.PluggableFactoryLoader; import org.apache.qpid.server.plugin.SystemConfigFactory; import org.apache.qpid.server.security.SecurityManager; -import org.apache.qpid.server.store.BrokerStoreUpgraderAndRecoverer; -import org.apache.qpid.server.store.DurableConfigurationStore; -import org.apache.qpid.util.SystemUtils; +import org.apache.qpid.server.util.Action; public class Broker implements BrokerShutdownProvider { @@ -63,23 +58,20 @@ public class Broker implements BrokerShutdownProvider private EventLogger _eventLogger; private boolean _configuringOwnLogging = false; private final TaskExecutor _taskExecutor = new TaskExecutorImpl(); - private final boolean _exitJVMOnShutdownWithNonZeroExitCode; private SystemConfig _systemConfig; - private org.apache.qpid.server.model.Broker _broker; - - private DurableConfigurationStore _store; + private final Action<Integer> _shutdownAction; public Broker() { - this(false); + this(null); } - public Broker(boolean exitJVMOnShutdownWithNonZeroExitCode) + public Broker(Action<Integer> shutdownAction) { - this._exitJVMOnShutdownWithNonZeroExitCode = exitJVMOnShutdownWithNonZeroExitCode; + _shutdownAction = shutdownAction; } protected static class InitException extends RuntimeException @@ -108,22 +100,10 @@ public class Broker implements BrokerShutdownProvider { try { - try - { - if (_broker != null) - { - _broker.close(); - } - } - finally + if(_systemConfig != null) { - if(_systemConfig != null) - { - _systemConfig.close(); - } + _systemConfig.close(); } - _store = null; - _broker = null; _taskExecutor.stop(); } @@ -134,9 +114,9 @@ public class Broker implements BrokerShutdownProvider LogManager.shutdown(); } - if (_exitJVMOnShutdownWithNonZeroExitCode && exitStatusCode != 0) + if (_shutdownAction != null) { - System.exit(exitStatusCode); + _shutdownAction.performAction(exitStatusCode); } } } @@ -178,6 +158,10 @@ public class Broker implements BrokerShutdownProvider { configureLogging(new File(options.getLogConfigFileLocation()), options.getLogWatchFrequency()); } + // Create the RootLogger to be used during broker operation + boolean statusUpdatesEnabled = Boolean.parseBoolean(System.getProperty(BrokerProperties.PROPERTY_STATUS_UPDATES, "true")); + MessageLogger messageLogger = new Log4jMessageLogger(statusUpdatesEnabled); + _eventLogger.setMessageLogger(messageLogger); PluggableFactoryLoader<SystemConfigFactory> configFactoryLoader = new PluggableFactoryLoader<>(SystemConfigFactory.class); @@ -194,66 +178,16 @@ public class Broker implements BrokerShutdownProvider _taskExecutor.start(); _systemConfig = configFactory.newInstance(_taskExecutor, _eventLogger, logRecorder, options.convertToSystemConfigAttributes(), this); - _systemConfig.open(); - _store = _systemConfig.getConfigurationStore(); - try { - // Create the RootLogger to be used during broker operation - boolean statusUpdatesEnabled = Boolean.parseBoolean(System.getProperty(BrokerProperties.PROPERTY_STATUS_UPDATES, "true")); - MessageLogger messageLogger = new Log4jMessageLogger(statusUpdatesEnabled); - final EventLogger eventLogger = _systemConfig.getEventLogger(); - eventLogger.setMessageLogger(messageLogger); - - //Create the composite (log4j+SystemOut MessageLogger to be used during startup - MessageLogger[] messageLoggers = {new SystemOutMessageLogger(), messageLogger}; - - CompositeStartupMessageLogger startupMessageLogger = new CompositeStartupMessageLogger(messageLoggers); - EventLogger startupLogger = new EventLogger(startupMessageLogger); - - startupLogger.message(BrokerMessages.STARTUP(QpidProperties.getReleaseVersion(), - QpidProperties.getBuildVersion())); - - startupLogger.message(BrokerMessages.PLATFORM(System.getProperty("java.vendor"), - System.getProperty("java.runtime.version", - System.getProperty("java.version")), - SystemUtils.getOSName(), - SystemUtils.getOSVersion(), - SystemUtils.getOSArch())); - - startupLogger.message(BrokerMessages.MAX_MEMORY(Runtime.getRuntime().maxMemory())); - - BrokerStoreUpgraderAndRecoverer upgrader = new BrokerStoreUpgraderAndRecoverer(_systemConfig); - org.apache.qpid.server.model.Broker broker = upgrader.perform(_store); - _broker = broker; - - broker.setEventLogger(startupLogger); - broker.open(); - - if (broker.getState() == State.ACTIVE) - { - startupLogger.message(BrokerMessages.READY()); - broker.setEventLogger(eventLogger); - } + _systemConfig.open(); } - catch(Exception e) + catch(RuntimeException e) { LOGGER.fatal("Exception during startup", e); try { - try - { - if (_broker != null) - { - _broker.close(); - } - } - finally - { - _systemConfig.close(); - } - _store = null; - _broker = null; + _systemConfig.close(); } catch(Exception ce) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/EventLogger.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/EventLogger.java index 70d1db794e..ed97e14ab4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/EventLogger.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/EventLogger.java @@ -59,4 +59,9 @@ public class EventLogger { _messageLogger = messageLogger; } + + public MessageLogger getMessageLogger() + { + return _messageLogger; + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java index a2f4f4ee0a..b9a4b32acb 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java @@ -556,9 +556,14 @@ public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> im { } + protected boolean rethrowRuntimeExceptionsOnOpen() + { + return false; + } + protected final void handleExceptionOnOpen(RuntimeException e) { - if (e instanceof ServerScopedRuntimeException) + if (rethrowRuntimeExceptionsOnOpen() || e instanceof ServerScopedRuntimeException) { throw e; } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java index 5dfb178f15..19918abb14 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java @@ -31,15 +31,21 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +import org.apache.qpid.common.QpidProperties; import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.configuration.store.ManagementModeStoreHandler; import org.apache.qpid.server.configuration.updater.TaskExecutor; +import org.apache.qpid.server.logging.CompositeStartupMessageLogger; import org.apache.qpid.server.logging.EventLogger; import org.apache.qpid.server.logging.LogRecorder; +import org.apache.qpid.server.logging.MessageLogger; +import org.apache.qpid.server.logging.SystemOutMessageLogger; import org.apache.qpid.server.logging.messages.BrokerMessages; +import org.apache.qpid.server.store.BrokerStoreUpgraderAndRecoverer; import org.apache.qpid.server.store.ConfiguredObjectRecord; import org.apache.qpid.server.store.ConfiguredObjectRecordConverter; import org.apache.qpid.server.store.DurableConfigurationStore; +import org.apache.qpid.util.SystemUtils; public abstract class AbstractSystemConfig<X extends SystemConfig<X>> extends AbstractConfiguredObject<X> implements SystemConfig<X> @@ -72,6 +78,9 @@ public abstract class AbstractSystemConfig<X extends SystemConfig<X>> @ManagedAttributeField private String _initialConfigurationLocation; + @ManagedAttributeField + private boolean _startupLoggedToSystemOut; + public AbstractSystemConfig(final TaskExecutor taskExecutor, final EventLogger eventLogger, @@ -103,12 +112,6 @@ public abstract class AbstractSystemConfig<X extends SystemConfig<X>> } @Override - public State getState() - { - return State.ACTIVE; - } - - @Override public EventLogger getEventLogger() { return _eventLogger; @@ -176,9 +179,9 @@ public abstract class AbstractSystemConfig<X extends SystemConfig<X>> try { _configurationStore.openConfigurationStore(this, - false, - convertToConfigurationRecords(getInitialConfigurationLocation(), - this)); + false, + convertToConfigurationRecords(getInitialConfigurationLocation(), + this)); _configurationStore.upgradeStoreStructure(); } catch (IOException e) @@ -186,6 +189,61 @@ public abstract class AbstractSystemConfig<X extends SystemConfig<X>> throw new IllegalArgumentException(e); } + + + } + + @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.ACTIVE) + protected void activate() + { + final EventLogger eventLogger = _eventLogger; + + EventLogger startupLogger; + if (isStartupLoggedToSystemOut()) + { + //Create the composite (logging+SystemOut MessageLogger to be used during startup + MessageLogger[] messageLoggers = {new SystemOutMessageLogger(), eventLogger.getMessageLogger()}; + + CompositeStartupMessageLogger startupMessageLogger = new CompositeStartupMessageLogger(messageLoggers); + startupLogger = new EventLogger(startupMessageLogger); + } + else + { + startupLogger = eventLogger; + } + + startupLogger.message(BrokerMessages.STARTUP(QpidProperties.getReleaseVersion(), + QpidProperties.getBuildVersion())); + + startupLogger.message(BrokerMessages.PLATFORM(System.getProperty("java.vendor"), + System.getProperty("java.runtime.version", + System.getProperty("java.version")), + SystemUtils.getOSName(), + SystemUtils.getOSVersion(), + SystemUtils.getOSArch())); + + startupLogger.message(BrokerMessages.MAX_MEMORY(Runtime.getRuntime().maxMemory())); + + BrokerStoreUpgraderAndRecoverer upgrader = new BrokerStoreUpgraderAndRecoverer(this); + upgrader.perform(); + + Broker broker = getBroker(); + + broker.setEventLogger(startupLogger); + broker.open(); + + if (broker.getState() == State.ACTIVE) + { + startupLogger.message(BrokerMessages.READY()); + broker.setEventLogger(eventLogger); + } + + } + + @Override + protected final boolean rethrowRuntimeExceptionsOnOpen() + { + return true; } abstract protected DurableConfigurationStore createStoreObject(); @@ -275,4 +333,10 @@ public abstract class AbstractSystemConfig<X extends SystemConfig<X>> { return _brokerShutdownProvider; } + + @Override + public boolean isStartupLoggedToSystemOut() + { + return _startupLoggedToSystemOut; + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java index c985541a53..a69808180d 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java @@ -35,7 +35,8 @@ public interface SystemConfig<X extends SystemConfig<X>> extends ConfiguredObjec String MANAGEMENT_MODE_HTTP_PORT_OVERRIDE = "managementModeHttpPortOverride"; String MANAGEMENT_MODE_PASSWORD = "managementModePassword"; String INITIAL_CONFIGURATION_LOCATION = "initialConfigurationLocation"; - + String STARTUP_LOGGED_TO_SYSTEM_OUT = "startupLoggedToSystemOut"; + @ManagedAttribute(defaultValue = "false") boolean isManagementMode(); @@ -57,6 +58,8 @@ public interface SystemConfig<X extends SystemConfig<X>> extends ConfiguredObjec @ManagedAttribute String getInitialConfigurationLocation(); + @ManagedAttribute(defaultValue = "true") + boolean isStartupLoggedToSystemOut(); EventLogger getEventLogger(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java index 2be2bbbf28..a2d8d21d58 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java @@ -604,8 +604,9 @@ public class BrokerStoreUpgraderAndRecoverer return brokerRecord; } - public Broker<?> perform(final DurableConfigurationStore store) + public Broker<?> perform() { + final DurableConfigurationStore store = _systemConfig.getConfigurationStore(); List<ConfiguredObjectRecord> upgradedRecords = upgrade(store); new GenericRecoverer(_systemConfig).recover(upgradedRecords); diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java index 57672dc4f7..0dee5821b2 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java @@ -44,8 +44,10 @@ import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.logging.EventLogger; import org.apache.qpid.server.logging.LogRecorder; +import org.apache.qpid.server.model.AbstractSystemConfig; import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.model.BrokerShutdownProvider; +import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.JsonSystemConfigImpl; import org.apache.qpid.server.model.Port; import org.apache.qpid.server.model.Protocol; @@ -87,7 +89,8 @@ public class ManagementModeStoreHandlerTest extends QpidTestCase - _root = new ConfiguredObjectRecordImpl(_rootId, Broker.class.getSimpleName(), Collections.<String,Object>emptyMap(), Collections.singletonMap(SystemConfig.class.getSimpleName(), systemContextRecord.getId())); + _root = new ConfiguredObjectRecordImpl(_rootId, Broker.class.getSimpleName(), Collections.singletonMap(Broker.NAME, + (Object) "broker"), Collections.singletonMap(SystemConfig.class.getSimpleName(), systemContextRecord.getId())); _portEntry = mock(ConfiguredObjectRecord.class); when(_portEntry.getId()).thenReturn(_portEntryId); @@ -120,11 +123,30 @@ public class ManagementModeStoreHandlerTest extends QpidTestCase private ManagementModeStoreHandler createManagementModeStoreHandler() { _systemConfig.close(); - _systemConfig = new JsonSystemConfigImpl(_taskExecutor, - mock(EventLogger.class), - mock(LogRecorder.class), - _options.convertToSystemConfigAttributes(), - mock(BrokerShutdownProvider.class)); + Map<String, Object> attributes = new HashMap<>(_options.convertToSystemConfigAttributes()); + attributes.put(ConfiguredObject.DESIRED_STATE, State.QUIESCED); + _systemConfig = new AbstractSystemConfig(_taskExecutor, + mock(EventLogger.class), + mock(LogRecorder.class), + attributes, + mock(BrokerShutdownProvider.class)) + { + @Override + protected void onOpen() + { + } + + @Override + protected DurableConfigurationStore createStoreObject() + { + return _store; + } + + @Override + protected void onClose() + { + } + }; _systemConfig.open(); return new ManagementModeStoreHandler(_store, _systemConfig); } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java index 76f8485884..f4c6926a17 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java @@ -41,6 +41,7 @@ import org.apache.log4j.Logger; import org.apache.qpid.common.QpidProperties; import org.apache.qpid.framing.ProtocolVersion; import org.apache.qpid.server.configuration.IllegalConfigurationException; +import org.apache.qpid.server.util.Action; import org.apache.qpid.util.FileUtils; /** @@ -454,7 +455,17 @@ public class Main protected void startBroker(final BrokerOptions options) throws Exception { - Broker broker = new Broker(true); + Broker broker = new Broker(new Action<Integer>() + { + @Override + public void performAction(final Integer exitStatusCode) + { + if (exitStatusCode != 0) + { + shutdown(exitStatusCode); + } + } + }); broker.startup(options); } diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java index 3d0fb90036..549edcd650 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java @@ -44,21 +44,7 @@ import org.apache.qpid.server.BrokerOptions; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.logging.EventLogger; import org.apache.qpid.server.logging.LogRecorder; -import org.apache.qpid.server.model.AbstractSystemConfig; -import org.apache.qpid.server.model.AccessControlProvider; -import org.apache.qpid.server.model.AuthenticationProvider; -import org.apache.qpid.server.model.Broker; -import org.apache.qpid.server.model.BrokerModel; -import org.apache.qpid.server.model.BrokerShutdownProvider; -import org.apache.qpid.server.model.ConfiguredObject; -import org.apache.qpid.server.model.GroupProvider; -import org.apache.qpid.server.model.JsonSystemConfigImpl; -import org.apache.qpid.server.model.Plugin; -import org.apache.qpid.server.model.PreferencesProvider; -import org.apache.qpid.server.model.SystemConfig; -import org.apache.qpid.server.model.UUIDGenerator; -import org.apache.qpid.server.model.VirtualHostAlias; -import org.apache.qpid.server.model.VirtualHostNode; +import org.apache.qpid.server.model.*; import org.apache.qpid.server.model.adapter.FileBasedGroupProvider; import org.apache.qpid.server.model.adapter.FileBasedGroupProviderImpl; import org.apache.qpid.server.plugin.PluggableFactoryLoader; @@ -216,10 +202,13 @@ public class TestBrokerConfiguration SystemConfigFactory configFactory = (new PluggableFactoryLoader<>(SystemConfigFactory.class)).get(_storeType); + Map<String, Object> attributes = new HashMap<>(brokerOptions.convertToSystemConfigAttributes()); + attributes.put(SystemConfig.STARTUP_LOGGED_TO_SYSTEM_OUT, false); + attributes.put(ConfiguredObject.DESIRED_STATE, State.QUIESCED); final SystemConfig parentObject = configFactory.newInstance(_taskExecutor, mock(EventLogger.class), mock(LogRecorder.class), - brokerOptions.convertToSystemConfigAttributes(), + attributes, mock(BrokerShutdownProvider.class)); parentObject.open(); @@ -252,6 +241,7 @@ public class TestBrokerConfiguration configurationStore.openConfigurationStore(parentObject,true,initialRecords.toArray(new ConfiguredObjectRecord[initialRecords.size()])); configurationStore.closeConfigurationStore(); + parentObject.close(); return true; } |
