diff options
author | Martin Ritchie <ritchiem@apache.org> | 2009-08-12 18:17:26 +0000 |
---|---|---|
committer | Martin Ritchie <ritchiem@apache.org> | 2009-08-12 18:17:26 +0000 |
commit | 0f4bde67479c5ee459cd2687903f932bcd0dd8c6 (patch) | |
tree | aed449bf36ba32e841c65770a6b750c7c3548c7a /qpid/java | |
parent | 3cd183b2e170ab0c7f190ff45a0a55bcd3478007 (diff) | |
download | qpid-python-0f4bde67479c5ee459cd2687903f932bcd0dd8c6.tar.gz |
QPID-2002 : Addition of JMX Management interface logging using the new Logging Interfaces
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@803649 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
9 files changed, 745 insertions, 18 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java index 14f64d2879..2afd3c1dc3 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java @@ -65,6 +65,8 @@ import org.apache.qpid.server.queue.AMQQueueMBean; import org.apache.qpid.server.queue.QueueRegistry; import org.apache.qpid.server.store.MessageStore; import org.apache.qpid.server.virtualhost.VirtualHost; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; /** * This MBean implements the broker management interface and exposes the @@ -79,7 +81,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr private final MessageStore _messageStore; private final VirtualHost.VirtualHostMBean _virtualHostMBean; - + @MBeanConstructor("Creates the Broker Manager MBean") public AMQBrokerManagerMBean(VirtualHost.VirtualHostMBean virtualHostMBean) throws JMException { @@ -189,6 +191,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr */ public void createNewExchange(String exchangeName, String type, boolean durable) throws JMException { + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { synchronized (_exchangeRegistry) @@ -210,6 +213,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr { throw new MBeanException(ex, "Error in creating exchange " + exchangeName); } + finally + { + CurrentActor.remove(); + } } /** @@ -225,6 +232,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr // boolean inUse = false; // Check if there are queue-bindings with the exchange and unregister // when there are no bindings. + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { _exchangeRegistry.unregisterExchange(new AMQShortString(exchangeName), false); @@ -233,6 +241,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr { throw new MBeanException(ex, "Error in unregistering exchange " + exchangeName); } + finally + { + CurrentActor.remove(); + } } /** @@ -252,6 +264,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr throw new JMException("The queue \"" + queueName + "\" already exists."); } + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { AMQShortString ownerShortString = null; @@ -275,6 +288,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr jme.initCause(ex); throw new MBeanException(jme, "Error in creating queue " + queueName); } + finally + { + CurrentActor.remove(); + } } private VirtualHost getVirtualHost() @@ -296,6 +313,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr throw new JMException("The Queue " + queueName + " is not a registerd queue."); } + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { queue.delete(); @@ -308,6 +326,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr jme.initCause(ex); throw new MBeanException(jme, "Error in deleting queue " + queueName); } + finally + { + CurrentActor.remove(); + } } public ManagedObject getParentObject() diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java index 4b609f592b..3567cdff85 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java @@ -43,6 +43,8 @@ import org.apache.qpid.framing.FieldTable; import org.apache.qpid.server.queue.IncomingMessage; import org.apache.qpid.server.queue.AMQQueue; import org.apache.qpid.server.virtualhost.VirtualHost; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; public class DirectExchange extends AbstractExchange { @@ -129,6 +131,7 @@ public class DirectExchange extends AbstractExchange throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange."); } + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { queue.bind(DirectExchange.this, new AMQShortString(binding), null); @@ -137,6 +140,10 @@ public class DirectExchange extends AbstractExchange { throw new MBeanException(ex); } + finally + { + CurrentActor.remove(); + } } }// End of MBean class diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java index fcaec8bdd0..7fa438587c 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java @@ -31,6 +31,8 @@ import org.apache.qpid.framing.FieldTable; import org.apache.qpid.server.queue.IncomingMessage; import org.apache.qpid.server.queue.AMQQueue; import org.apache.qpid.server.virtualhost.VirtualHost; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; import javax.management.JMException; import javax.management.MBeanException; @@ -102,6 +104,7 @@ public class FanoutExchange extends AbstractExchange throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange."); } + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { queue.bind(FanoutExchange.this, new AMQShortString(BINDING_KEY_SUBSTITUTE), null); @@ -110,6 +113,10 @@ public class FanoutExchange extends AbstractExchange { throw new MBeanException(ex); } + finally + { + CurrentActor.remove(); + } } } // End of MBean class diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java index be7a1dc196..31db1148c6 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java @@ -37,6 +37,8 @@ import org.apache.qpid.server.exchange.topic.TopicParser; import org.apache.qpid.server.exchange.topic.TopicMatcherResult; import org.apache.qpid.server.filter.MessageFilter; import org.apache.qpid.server.filter.JMSSelectorFilter; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; import javax.management.JMException; import javax.management.MBeanException; @@ -351,6 +353,7 @@ public class TopicExchange extends AbstractExchange throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange."); } + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { queue.bind(TopicExchange.this, new AMQShortString(binding), null); @@ -359,6 +362,10 @@ public class TopicExchange extends AbstractExchange { throw new MBeanException(ex); } + finally + { + CurrentActor.remove(); + } } } // End of MBean class diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java index c6e07f6f48..594ae24502 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java @@ -20,6 +20,10 @@ */ package org.apache.qpid.server.management; +import org.apache.qpid.server.logging.actors.ManagementActor; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.LogActor; + import javax.management.ListenerNotFoundException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; @@ -50,10 +54,15 @@ public abstract class AMQManagedObject extends DefaultManagedObject protected MBeanInfo _mbeanInfo; + protected LogActor _logActor; + protected AMQManagedObject(Class<?> managementInterface, String typeName, int version) throws NotCompliantMBeanException { super(managementInterface, typeName, version); + // CurrentActor will be defined as these objects are created during + // broker startup. + _logActor = new ManagementActor(CurrentActor.get().getRootMessageLogger()); buildMBeanInfo(); } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java index e8ea56bafd..dc12fdeff7 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java @@ -659,7 +659,7 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, Managable { _closed = true; - _actor.message(ConnectionMessages.CON_1002()); + CurrentActor.get().message(_logSubject, ConnectionMessages.CON_1002()); if (_virtualHost != null) { diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java index 225a01386b..81dbeeded2 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java @@ -66,7 +66,9 @@ import org.apache.qpid.management.common.mbeans.annotations.MBeanDescription; import org.apache.qpid.protocol.AMQConstant; import org.apache.qpid.server.AMQChannel; import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; import org.apache.qpid.server.logging.LogActor; +import org.apache.qpid.server.logging.RootMessageLogger; import org.apache.qpid.server.management.AMQManagedObject; import org.apache.qpid.server.management.ManagedObject; @@ -187,7 +189,7 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed */ public void commitTransactions(int channelId) throws JMException { - CurrentActor.set(getLogActor()); + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { AMQChannel channel = _session.getChannel(channelId); @@ -216,7 +218,7 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed */ public void rollbackTransactions(int channelId) throws JMException { - CurrentActor.set(getLogActor()); + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); try { AMQChannel channel = _session.getChannel(channelId); @@ -281,7 +283,22 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed 0, 0); - CurrentActor.set(getLogActor()); + // This seems ugly but because we use closeConnection in both normal + // broker operation and as part of the management interface it cannot + // be avoided. The Current Actor will be null when this method is + // called via the Management interface. This is because we allow the + // Local API connection with JConsole. If we did not allow that option + // then the CurrentActor could be set in our JMX Proxy object. + // As it is we need to set the CurrentActor on all MBean methods + // Ideally we would not have a single method that can be called from + // two contexts. + boolean removeActor = false; + if (CurrentActor.get() == null) + { + removeActor = true; + CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger())); + } + try { _session.writeFrame(responseBody.generateFrame(0)); @@ -298,21 +315,13 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed } finally { - CurrentActor.remove(); + if (removeActor) + { + CurrentActor.remove(); + } } } - /** - * Return the LogActor for this MBean Session - * //fixme currently simply returning the managed sessions LogActor, should - * be the ManagementActor - * @return - */ - private LogActor getLogActor() - { - return _session.getLogActor(); - } - @Override public MBeanNotificationInfo[] getNotificationInfo() { diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java index 7584a3b7cc..6e87cfbb76 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java @@ -45,7 +45,7 @@ public class ExchangeBinding _arguments = arguments == null ? EMPTY_ARGUMENTS : arguments; _logSubject = new BindingLogSubject(routingKey,exchange,queue); - CurrentActor.get().message(_logSubject, BindingMessages.BND_1001(_arguments.toString(), arguments != null)); + CurrentActor.get().message(_logSubject, BindingMessages.BND_1001(String.valueOf(_arguments), arguments != null)); } diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java new file mode 100644 index 0000000000..74dd7e9964 --- /dev/null +++ b/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java @@ -0,0 +1,666 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.jmx; + +import org.apache.qpid.commands.objects.AllObjects; +import org.apache.qpid.management.common.JMXConnnectionFactory; +import org.apache.qpid.management.common.mbeans.ManagedBroker; +import org.apache.qpid.management.common.mbeans.ManagedConnection; +import org.apache.qpid.management.common.mbeans.ManagedExchange; +import org.apache.qpid.server.logging.AbstractTestLogging; +import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject; + +import javax.jms.Connection; +import javax.management.JMException; +import javax.management.MBeanException; +import javax.management.MBeanServerConnection; +import javax.management.MBeanServerInvocationHandler; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import java.io.IOException; +import java.util.List; +import java.util.Set; + +/** + * Test class to test if any change in the broker JMX code is affesting the management console + * There are some hardcoding of management feature names and parameter names to create a customized + * look in the console. + */ +public class ManagementActorLoggingTest extends AbstractTestLogging +{ + MBeanServerConnection _mbsc; + JMXConnector _jmxc; + private static final String USER = "admin"; + + @Override + public void setUp() throws Exception + { + setConfigurationProperty("management.enabled", "true"); + super.setUp(); + + if (isExternalBroker()) + { + _jmxc = JMXConnnectionFactory.getJMXConnection( + 5000, "127.0.0.1", + getManagementPort(getPort()), USER, USER); + + _mbsc = _jmxc.getMBeanServerConnection(); + } + } + + @Override + public void tearDown() throws Exception + { + if (isExternalBroker()) + { + _jmxc.close(); + } + super.tearDown(); + } + + /** + * Description: + * When a JMX Management connection is made then this will be logged out. + * + * Input: + * + * 1. Running Broker + * 2. Connect Management client via JMX + * Output: + * + * <date> MNG-1007 : Open <user> + * + * Validation Steps: + * 1. The MNG ID is correct + * 2. The user is correct + * + * On connection close a MNG-1008 is expected + * + * * <date> MNG-1008 : Close + * + * Validation Steps: + * 1. The MNG ID is correct + * + * @throws java.io.IOException - if there is a problem reseting the log monitor + */ + public void testJMXManagementConsoleConnection() throws IOException + { + if (isExternalBroker()) + { + List<String> results = _monitor.findMatches("MNG-1007"); + + assertEquals("Unexpected Management Connection count", 1, results.size()); + + String log = getLog(results.get(0)); + + validateMessageID("MNG-1007", log); + + assertTrue("User not in log message:" + log, log.endsWith(USER)); + // Extract the id from the log string + // MESSAGE [mng:1(rmi://169.24.29.116)] MNG-1007 : Open : User admin + int connectionID = Integer.parseInt(fromActor(getLog(results.get(0))).charAt(4) + ""); + + results = _monitor.findMatches("MNG-1008"); + + assertEquals("Unexpected Management Connection close count", 0, results.size()); + + _jmxc.close(); + + results = _monitor.findMatches("MNG-1008"); + + assertEquals("Unexpected Management Connection count", 1, results.size()); + + assertEquals("Close does not have same id as open,", connectionID, + Integer.parseInt(fromActor(getLog(results.get(0))).charAt(4) + "")); + } + } + + /** + * Description: + * When a connected client has its connection closed via the Management Console this will be logged as a CON-1002 message. + * Input: + * + * 1. Running Broker + * 2. Connected Client + * 3. Connection is closed via Management Console + * Output: + * + * <date> CON-1002 : Close + * + * Validation Steps: + * 4. The CON ID is correct + * 5. This must be the last CON message for the Connection + * 6. It must be preceded by a CON-1001 for this Connection + * + * @throws Exception - {@see ManagedConnection.closeConnection and #getConnection} + * @throws java.io.IOException - if there is a problem reseting the log monitor + */ + public void testConnectionCloseViaManagement() throws IOException, Exception + { + if (isExternalBroker()) + { + + //Create a connection to the broker + Connection connection = getConnection(); + + // Get all active AMQP connections + AllObjects allObject = new AllObjects(_mbsc); + allObject.querystring = "org.apache.qpid:type=VirtualHost.Connection,*"; + + Set<ObjectName> objectNames = allObject.returnObjects(); + + assertEquals("More than one test connection returned", 1, objectNames.size()); + + ObjectName connectionName = objectNames.iterator().next(); + + ManagedConnection mangedConnection = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, connectionName, + ManagedConnection.class, false); + + //Close the connection + mangedConnection.closeConnection(); + + //Validate results + List<String> results = _monitor.findMatches("CON-1002"); + + + assertEquals("Unexpected Connection Close count", 1, results.size()); + } + } + + /** + * Description: + * Exchange creation is possible from the Management Console. + * When an exchanged is created in this way then a EXH-1001 create message + * is expected to be logged. + * Input: + * + * 1. Running broker + * 2. Connected Management Console + * 3. Exchange Created via Management Console + * Output: + * + * EXH-1001 : Create : [Durable] Type:<value> Name:<value> + * + * Validation Steps: + * 4. The EXH ID is correct + * 5. The correct tags are present in the message based on the create options + * + * @throws java.io.IOException - if there is a problem reseting the log monitor + * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue} + */ + public void testCreateExchangeDirectTransientViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous exchange declares + _monitor.reset(); + + createExchange("direct"); + + // Validate + + //1 - ID is correct + List<String> results = _monitor.findMatches("EXH-1001"); + + assertEquals("More than one exchange creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct exchange name + assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName())); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + + } + } + + public void testCreateExchangeTopicTransientViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous exchange declares + _monitor.reset(); + + createExchange("topic"); + + // Validate + + //1 - ID is correct + List<String> results = _monitor.findMatches("EXH-1001"); + + assertEquals("More than one exchange creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct exchange name + assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName())); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + + } + } + + public void testCreateExchangeFanoutTransientViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous exchange declares + _monitor.reset(); + + createExchange("fanout"); + + // Validate + + //1 - ID is correct + List<String> results = _monitor.findMatches("EXH-1001"); + + assertEquals("More than one exchange creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct exchange name + assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName())); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + + } + } + + public void testCreateExchangeHeadersTransientViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous exchange declares + _monitor.reset(); + + createExchange("headers"); + + // Validate + + //1 - ID is correct + List<String> results = _monitor.findMatches("EXH-1001"); + + assertEquals("More than one exchange creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct exchange name + assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName())); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + + } + } + + /** + * Description: + * Queue creation is possible from the Management Console. When a queue is created in this way then a QUE-1001 create message is expected to be logged. + * Input: + * + * 1. Running broker + * 2. Connected Management Console + * 3. Queue Created via Management Console + * Output: + * + * <date> QUE-1001 : Create : Transient Owner:<name> + * + * Validation Steps: + * 4. The QUE ID is correct + * 5. The correct tags are present in the message based on the create options + * + * @throws java.io.IOException - if there is a problem reseting the log monitor + * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue} + */ + public void testCreateQueueTransientViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous queue declares + _monitor.reset(); + + createQueue(); + + // Validate + + List<String> results = _monitor.findMatches("QUE-1001"); + + assertEquals("More than one queue creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct queue name + String subject = fromSubject(log); + assertEquals("Incorrect queue name created", getName(), AbstractTestLogSubject.getSlice("qu", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + } + } + + /** + * Description: + * The ManagementConsole can be used to delete a queue. When this is done a QUE-1002 Deleted message must be logged. + * Input: + * + * 1. Running Broker + * 2. Queue created on the broker with no subscribers + * 3. Management Console connected + * 4. Queue is deleted via Management Console + * Output: + * + * <date> QUE-1002 : Deleted + * + * Validation Steps: + * 5. The QUE ID is correct + * + * @throws java.io.IOException - if there is a problem reseting the log monitor + * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue} + */ + public void testQueueDeleteViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous queue declares + _monitor.reset(); + + createQueue(); + + ManagedBroker managedBroker = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getVirtualHostManagerObjectName(), + ManagedBroker.class, false); + + managedBroker.deleteQueue(getName()); + + List<String> results = _monitor.findMatches("QUE-1002"); + + assertEquals("More than one queue deletion found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct binding + String subject = fromSubject(log); + assertEquals("Incorrect queue named in delete", getName(), AbstractTestLogSubject.getSlice("qu", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + + } + } + + /** + * Description: + * The binding of a Queue and an Exchange is done via a Binding. When this Binding is created via the Management Console a BND-1001 Create message will be logged. + * Input: + * + * 1. Running Broker + * 2. Connected Management Console + * 3. Use Management Console to perform binding + * Output: + * + * <date> BND-1001 : Create + * + * Validation Steps: + * 4. The BND ID is correct + * 5. This will be the first message for the given binding + * + * @throws java.io.IOException - if there is a problem reseting the log monitor + * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.createNewBinding} + */ + public void testBindingCreateOnDirectViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous queue declares + _monitor.reset(); + + createQueue(); + + ManagedExchange managedExchange = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getExchange("amq.direct"), + ManagedExchange.class, false); + + managedExchange.createNewBinding(getName(), getName()); + + List<String> results = _monitor.findMatches("BND-1001"); + + assertEquals("More than one bind creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct binding + String subject = fromSubject(log); + assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject)); + assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + } + } + + public void testBindingCreateOnTopicViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous queue declares + _monitor.reset(); + + createQueue(); + + ManagedExchange managedExchange = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getExchange("amq.topic"), + ManagedExchange.class, false); + + managedExchange.createNewBinding(getName(), getName()); + + List<String> results = _monitor.findMatches("BND-1001"); + + assertEquals("More than one bind creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct binding + String subject = fromSubject(log); + assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject)); + assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + } + } + + public void testBindingCreateOnFanoutViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + //Remove any previous queue declares + _monitor.reset(); + + createQueue(); + + ManagedExchange managedExchange = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getExchange("amq.fanout"), + ManagedExchange.class, false); + + managedExchange.createNewBinding(getName(), getName()); + + List<String> results = _monitor.findMatches("BND-1001"); + + assertEquals("More than one bind creation found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct binding + String subject = fromSubject(log); + assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject)); + assertEquals("Incorrect routing key in create", "*", AbstractTestLogSubject.getSlice("rk", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + } + } + + /** + * Description: + * Bindings can be deleted so that a queue can be rebound with a different set of values. This can be performed via the Management Console + * Input: + * + * 1. Running Broker + * 2. Management Console connected + * 3. Management Console is used to perform unbind. + * Output: + * + * <date> BND-1002 : Deleted + * + * Validation Steps: + * 4. The BND ID is correct + * 5. There must have been a BND-1001 Create message first. + * 6. This will be the last message for the given binding + * + * @throws java.io.IOException - if there is a problem reseting the log monitor or an issue with the JMX Connection + * @throws javax.management.JMException - {@see #createExchange and ManagedBroker.unregisterExchange} + */ + public void testUnRegisterExchangeViaManagementConsole() throws IOException, JMException + { + if (isExternalBroker()) + { + + //Remove any previous queue declares + _monitor.reset(); + + createExchange("direct"); + + ManagedBroker managedBroker = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getVirtualHostManagerObjectName(), + ManagedBroker.class, false); + + managedBroker.unregisterExchange(getName()); + + List<String> results = _monitor.findMatches("EXH-1002"); + + assertEquals("More than one exchange deletion found", 1, results.size()); + + String log = getLog(results.get(0)); + + // Validate correct binding + String subject = fromSubject(log); + assertEquals("Incorrect exchange named in delete", "direct/" + getName(), AbstractTestLogSubject.getSlice("ex", subject)); + + // Validate it was a management actor. + String actor = fromActor(log); + assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng")); + } + } + + /** + * Create a non-durable test exchange with the current test name + * + * @throws JMException - is thrown if a exchange with this testName already exists + * @throws IOException - if there is a problem with the JMX Connection + * @throws javax.management.MBeanException + * - if there is another problem creating the exchange + */ + private void createExchange(String type) + throws JMException, IOException, MBeanException + { + ManagedBroker managedBroker = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getVirtualHostManagerObjectName(), + ManagedBroker.class, false); + + managedBroker.createNewExchange(getName(), type, false); + } + + /** + * Create a non-durable queue (with no owner) that is named after the + * creating test. + * + * @throws JMException - is thrown if a queue with this testName already exists + * @throws IOException - if there is a problem with the JMX Connection + */ + private void createQueue() + throws JMException, IOException + { + ManagedBroker managedBroker = MBeanServerInvocationHandler. + newProxyInstance(_mbsc, getVirtualHostManagerObjectName(), + ManagedBroker.class, false); + + managedBroker.createNewQueue(getName(), null, false); + } + + /** + * Retrive the ObjectName for the test Virtualhost. + * + * This is then use to create aproxy to the ManagedBroker MBean. + * + * @return the ObjectName for the 'test' VirtualHost. + */ + private ObjectName getVirtualHostManagerObjectName() + { + // Get the name of the test manager + AllObjects allObject = new AllObjects(_mbsc); + allObject.querystring = "org.apache.qpid:type=VirtualHost.VirtualHostManager,VirtualHost=test,*"; + + Set<ObjectName> objectNames = allObject.returnObjects(); + + assertEquals("Incorrect number test vhosts returned", 1, objectNames.size()); + + // We have verified we have only one value in objectNames so return it + return objectNames.iterator().next(); + } + + /** + * Retrive the ObjectName for the given Exchange on the test Virtualhost. + * + * This is then use to create aproxy to the ManagedExchange MBean. + * + * @param exchange The exchange to retireve e.g. 'direct' + * + * @return the ObjectName for the given exchange on the test VirtualHost. + */ + private ObjectName getExchange(String exchange) + { + // Get the name of the test manager + AllObjects allObject = new AllObjects(_mbsc); + allObject.querystring = "org.apache.qpid:type=VirtualHost.Exchange,VirtualHost=test,name=" + exchange + ",*"; + + Set<ObjectName> objectNames = allObject.returnObjects(); + + assertEquals("Incorrect number of exchange with name '" + exchange + + "' returned", 1, objectNames.size()); + + // We have verified we have only one value in objectNames so return it + return objectNames.iterator().next(); + } + +} |