diff options
3 files changed, 80 insertions, 29 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java index 4e4acb3e21..17a5bc3a04 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java @@ -58,6 +58,7 @@ public interface Broker<X extends Broker<X>> extends ConfiguredObject<X>, EventL String CONNECTION_CLOSE_WHEN_NO_ROUTE = "connection.closeWhenNoRoute"; String BROKER_FLOW_TO_DISK_THRESHOLD = "broker.flowToDiskThreshold"; + String BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD = "broker.failStartupWithErroredChild"; String QPID_AMQP_PORT = "qpid.amqp_port"; String QPID_HTTP_PORT = "qpid.http_port"; @@ -86,6 +87,8 @@ public interface Broker<X extends Broker<X>> extends ConfiguredObject<X>, EventL @ManagedContextDefault(name = BROKER_FRAME_SIZE) int DEFAULT_FRAME_SIZE = 65535; + @ManagedContextDefault(name = BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD) + boolean DEFAULT_BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD = false; @DerivedAttribute String getBuildVersion(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java index d413050cef..313fd509e2 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java @@ -235,41 +235,42 @@ public class BrokerAdapter extends AbstractConfiguredObject<BrokerAdapter> imple _managementModeAuthenticationProvider.open(); } - for(KeyStore<?> keyStore : getChildren(KeyStore.class)) - { - addKeyStore(keyStore); - } - for(TrustStore<?> trustStore : getChildren(TrustStore.class)) - { - addTrustStore(trustStore); - } - for(AuthenticationProvider<?> authenticationProvider : getChildren(AuthenticationProvider.class)) - { - addAuthenticationProvider(authenticationProvider); - } - for(Port<?> port : getChildren(Port.class)) - { - addPort(port); - } - for(Plugin<?> plugin : getChildren(Plugin.class)) - { - addPlugin(plugin); - } - for(GroupProvider<?> groupProvider : getChildren(GroupProvider.class)) - { - addGroupProvider(groupProvider); - } - for(AccessControlProvider<?> accessControlProvider : getChildren(AccessControlProvider.class)) + boolean hasBrokerAnyErroredChildren = false; + + for (final Class<? extends ConfiguredObject> childClass : getModel().getChildTypes(getCategoryClass())) { - addAccessControlProvider(accessControlProvider); + final Collection<? extends ConfiguredObject> children = getChildren(childClass); + if (children != null) { + for (final ConfiguredObject<?> child : children) { + + if (child instanceof AccessControlProvider) + { + addAccessControlProvider((AccessControlProvider)child); + } + else + { + child.addChangeListener(this); + } + + if (child.getState() == State.ERRORED ) + { + hasBrokerAnyErroredChildren = true; + LOGGER.warn(String.format("Broker child object '%s' of type '%s' is %s", + child.getName(), childClass.getSimpleName(), State.ERRORED )); + } + } + } } - for(VirtualHostNode<?> virtualHostNode : getChildren(VirtualHostNode.class)) + + final boolean brokerShutdownOnErroredChild = getContextValue(Boolean.class, BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD); + if (!_brokerOptions.isManagementMode() && brokerShutdownOnErroredChild && hasBrokerAnyErroredChildren) { - addVirtualHostNode(virtualHostNode); + throw new IllegalStateException(String.format("Broker context variable %s is set and the broker has %s children", + BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD, State.ERRORED)); } initialiseStatisticsReporting(); - // changeChildState(State.ACTIVE, false); + if (isManagementMode()) { _eventLogger.message(BrokerMessages.MANAGEMENT_MODE(BrokerOptions.MANAGEMENT_MODE_USER_NAME, diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java index 9f5dd2ec39..e267bf439b 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java @@ -24,6 +24,7 @@ import java.io.File; import java.util.List; import javax.jms.Connection; +import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.Session; @@ -183,4 +184,50 @@ public class BrokerStartupTest extends AbstractTestLogging } } + public void testStartupWithErroredChildrenCanBeConfigured() throws Exception + { + if (isJavaBroker()) + { + int port = getPort(0); + int managementPort = getManagementPort(port); + int connectorServerPort = managementPort + JMXPORT_CONNECTORSERVER_OFFSET; + + setTestSystemProperty("qpid.amqp_port",String.valueOf(port)); + setTestSystemProperty("qpid.jmx_port",String.valueOf(managementPort)); + setTestSystemProperty("qpid.rmi_port",String.valueOf(connectorServerPort)); + + //Purposely set the HTTP port to be the same as the AMQP port so that the port object becomes ERRORED + setTestSystemProperty("qpid.http_port",String.valueOf(port)); + + // Set broker to fail on startup if it has ERRORED children + setTestSystemProperty("broker.failStartupWithErroredChild", String.valueOf(Boolean.TRUE)); + + File brokerConfigFile = new File(getTestConfigFile(port)); + if (brokerConfigFile.exists()) + { + // Config exists from previous test run, delete it. + brokerConfigFile.delete(); + } + + startBroker(port, null); + + AMQConnectionURL url = new AMQConnectionURL(String.format("amqp://" + + GUEST_USERNAME + + ":" + + GUEST_PASSWORD + + "@clientid/?brokerlist='localhost:%d'", port)); + + try + { + Connection conn = getConnection(url); + fail("Connection should fail as broker startup should have failed due to ERRORED children (port)"); + conn.close(); + } + catch (JMSException jmse) + { + //pass + } + } + } + } |
