From ded496fbb486cf0071ed2374450a01be5ac82059 Mon Sep 17 00:00:00 2001 From: Brett Delle Grazie Date: Wed, 29 Aug 2018 14:59:39 +0100 Subject: [PATCH 1/3] Refactor to permit passing in URLs from command line - includes support for SSL - includes support for clusters (via JXM) - includes support for a config file - includes support for username / passwords - including Docs --- README.md | 52 +++-- pom.xml | 4 +- .../manager/connector/ArtemisConnector.java | 24 ++- .../CombinedJmsAndJmxArtemisConnector.java | 122 ++++++++++-- .../connector/JmxArtemisConnector.java | 116 ++++++++++-- .../manager/connector/jms/JmsManagement.java | 2 +- .../manager/connector/jms/JmsProcessor.java | 28 ++- .../manager/connector/jmx/JmxProcessor.java | 177 +++++++++++------- .../tools/command/AbstractArtemisCommand.java | 47 ++++- .../framework/tools/command/Browse.java | 5 +- .../framework/tools/command/ListQueues.java | 7 +- .../framework/tools/command/ListTopics.java | 7 +- .../tools/command/QueueMessageCounts.java | 10 +- .../framework/tools/command/Remove.java | 11 +- .../framework/tools/command/Reprocess.java | 11 +- .../tools/command/TopicMessageCounts.java | 10 +- .../tools/common/command/Bootstrap.java | 1 + .../uk/gov/justice/output/ConsolePrinter.java | 9 +- .../uk/gov/justice/output/OutputPrinter.java | 5 +- .../artemis/manager/ArtemisManagerIT.java | 32 +--- .../CombinedJmsAndJmxArtemisConnectorIT.java | 59 +++--- .../connector/JmxArtemisConnectorIT.java | 62 +++--- ...ManagementFunctionFailedExceptionTest.java | 8 +- .../artemis/manager/util/JmsTestUtil.java | 35 +++- .../framework/tools/command/BrowseTest.java | 13 +- .../tools/command/ListQueuesTest.java | 16 +- .../tools/command/ListTopicsTest.java | 16 +- .../tools/command/QueueMessageCountsTest.java | 20 +- .../framework/tools/command/RemoveTest.java | 35 ++-- .../tools/command/ReprocessTest.java | 15 +- .../tools/command/TopicMessageCountsTest.java | 18 +- 31 files changed, 647 insertions(+), 330 deletions(-) diff --git a/README.md b/README.md index 6dfa760..db2b182 100644 --- a/README.md +++ b/README.md @@ -2,30 +2,47 @@ [![Build Status](https://travis-ci.org/CJSCommonPlatform/artemis-manager.svg?branch=master)](https://travis-ci.org/CJSCommonPlatform/artemis-manager) [![Coverage Status](https://coveralls.io/repos/github/CJSCommonPlatform/artemis-manager/badge.svg?branch=master)](https://coveralls.io/github/CJSCommonPlatform/artemis-manager?branch=master) +## Configuration -## Browse DLQ +Configuration can be supplied in a config file and passed to the application via a '@' option. + +* -jmxUrl: The full JMX url, can be used multiple times for clusters. (default: service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi) +* -brokerName: Name of the broker (default: "default") +* -jmxUsername: User for JMX (default none) +* -jmxPassword: Password for JMX (default none) +* -jmsUrl: The JMS url, you should add the clientID as above. You can also add sslEnabled=true to get SSL capability (default: tcp://localhost:61616?clientID=artemis-manager) +* -jmsUsername: User for JMS (default none) +* -jmsPassword: Password for JMS (default none) + +A complicated example configuration file might look like: -**Note: Browse uses JMS tcp port to connect to the Artemis broker.** +Assuming two brokers on 192.168.0.10 and 192.168.0.11, with JMX on 1098 and OpenWire on 61616 (but no security) -_java -jar artemis-manager.jar browse -host localhost -port 61616 -brokerName default_ +``` +-jmxUrl service:jmx:rmi:///jndi/rmi://192.168.0.10:1098/jmxrmi +-jmxUrl service:jmx:rmi:///jndi/rmi://192.168.0.11:1098/jmxrmi +-jmsUrl tcp://(192.168.0.10:61616,192.168.0.11:61616)?clientID=artemis-manager&sslEnabled=true +``` -* port - JMS tcp port -* brokerName - name of the broker configured in the broker.xml, use _default_ if no specific broker configuration provided +In the examples below it is assumed a configuration file of artemis.config has been created like that shown above + +## Browse DLQ + +**Note: Browse uses JMS to connect to the Artemis broker.** + +`java -jar artemis-manager.jar browse @artemis.config` ## Remove Message from DLQ * Remove message by id -**Note: Remove uses JMX port to connect to the Artemis broker.** +**Note: Remove uses JMX to connect to the Artemis broker.** -_java -jar artemis-manager.jar remove -host localhost -port 3000 -brokerName default -msgId 12d8e63e-c842-11e6-986d-00e1000074d2_ - -* port - JMX port -* brokerName - name of the broker configured in the broker.xml, use _default_ if no specific broker configuration provided +`java -jar artemis-manager.jar remove @artemis.config -msgId 12d8e63e-c842-11e6-986d-00e1000074d2` * Remove multiple messages (provide list of message ids on input) -_echo msgId1 msgId2 | java -jar artemis-manager.jar remove -host localhost -port 3000 -brokerName default_ +`echo msgId1 msgId2 | java -jar artemis-manager.jar remove` ## Reprocess Message from DLQ @@ -33,14 +50,11 @@ _echo msgId1 msgId2 | java -jar artemis-manager.jar remove -host localhost -port **Note: Reprocess uses JMX port to connect to the Artemis broker.** -_java -jar artemis-manager.jar reprocess -host localhost -port 3000 -brokerName default -msgId 12d8e63e-c842-11e6-986d-00e1000074d2_ - -* port - JMX port -* brokerName - name of the broker configured in the broker.xml, use _default_ if no specific broker configuration provided +`java -jar artemis-manager.jar reprocess @artemis.config -msgId 12d8e63e-c842-11e6-986d-00e1000074d2` * Reprocess multiple messages (provide list of message ids on input) -_echo msgId1 msgId2 | java -jar artemis-manager.jar reprocess -host localhost -port 3000 -brokerName default_ +`echo msgId1 msgId2 | java -jar artemis-manager.jar reprocess @artemis.config` ## Chaining Commands @@ -48,4 +62,8 @@ _echo msgId1 msgId2 | java -jar artemis-manager.jar reprocess -host localhost -p This will remove all messages from DLQ that have been originally sent to the queue abracadabra -_java -jar target/artemis-manager.jar browse -host localhost -port 3000 -brokerName default | jgrep originalDestination=jms.queue.abracadabra -s msgId | java -jar target/artemis-manager.jar remove -host localhost -port 3000 -brokerName default_ +``` +java -jar target/artemis-manager.jar browse @artemis.config |\ + jgrep originalDestination=jms.queue.abracadabra -s msgId |\ + java -jar target/artemis-manager.jar remove @artemis.config +``` diff --git a/pom.xml b/pom.xml index d074c29..8d3724f 100644 --- a/pom.xml +++ b/pom.xml @@ -204,8 +204,10 @@ false ${artemis.home} - -Dcom.sun.management.jmxremote \ + -Dcom.sun.management.jmxremote=true \ + -Dcom.sun.management.jmxremote.rmi.port=3000 \ -Dcom.sun.management.jmxremote.port=3000 \ + -Djava.rmi.server.hostname=localhost \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java index 4ddd7a3..74d6db9 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java @@ -1,22 +1,32 @@ package uk.gov.justice.artemis.manager.connector; +import java.net.MalformedURLException; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; public interface ArtemisConnector { - List messagesOf(final String host, final String port, final String brokerName, final String destinationName) throws Exception; + List messagesOf(final String destinationName) throws Exception; - long remove(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception; + long remove(final String destinationName, final Iterator msgIds) throws Exception; - long reprocess(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception; + long reprocess(final String destinationName, final Iterator msgIds) throws Exception; - String[] queueNames(final String host, final String port, final String brokerName) throws Exception; + List queueNames() throws Exception; - String[] topicNames(final String host, final String port, final String brokerName) throws Exception; + List topicNames() throws Exception; - Map queueMessageCount(final String host, final String port, final String brokerName, final String[] queueNames) throws Exception; + Map queueMessageCount(final Collection queueNames) throws Exception; - Map topicMessageCount(final String host, final String port, final String brokerName, final String[] topicNames) throws Exception; + Map topicMessageCount(final Collection queueNames) throws Exception; + + void setParameters(final List jmxUrls, + final String brokerName, + final String jmxUsername, + final String jmxPassword, + final String jmsUrl, + final String jmsUsername, + final String jmsPassword) throws MalformedURLException; } \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java index cdec95a..d0ac0e0 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java @@ -1,19 +1,33 @@ package uk.gov.justice.artemis.manager.connector; +import static java.util.Collections.emptyMap; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.summingLong; +import static java.util.stream.Collectors.toList; import static pl.touk.throwing.ThrowingFunction.unchecked; +import uk.gov.justice.artemis.manager.connector.jms.JmsManagement; +import uk.gov.justice.artemis.manager.connector.jms.JmsProcessor; +import uk.gov.justice.artemis.manager.connector.jmx.JmxManagement; +import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; +import uk.gov.justice.output.ConsolePrinter; + +import java.net.MalformedURLException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXServiceURL; + +import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; import org.apache.activemq.artemis.api.jms.management.DestinationControl; import org.apache.activemq.artemis.api.jms.management.JMSServerControl; - -import uk.gov.justice.artemis.manager.connector.jms.JmsManagement; -import uk.gov.justice.artemis.manager.connector.jms.JmsProcessor; -import uk.gov.justice.artemis.manager.connector.jmx.JmxManagement; -import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; -import uk.gov.justice.output.ConsolePrinter; +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; /** * reprocess, remove and messagesOf were re-implemented in JMS due to issues with large messages @@ -26,38 +40,106 @@ public class CombinedJmsAndJmxArtemisConnector implements ArtemisConnector { private final JmsProcessor jmsProcessor = new JmsProcessor(); private final JmsManagement jmsManagement = new JmsManagement(); + private List jmxServiceUrls; + private Map jmxEnvironment; + private ObjectNameBuilder objectNameBuilder; + + private ActiveMQJMSConnectionFactory jmsFactory; + + @Override + public void setParameters(final List jmxUrls, + final String brokerName, + final String jmxUsername, + final String jmxPassword, + final String jmsUrl, + final String jmsUsername, + final String jmsPassword) throws MalformedURLException { + this.jmxServiceUrls = jmxProcessor.processJmxUrls(jmxUrls); + this.objectNameBuilder = jmxProcessor.getObjectNameBuilder(brokerName); + + if ((jmxUsername != null) && (jmxPassword != null)) { + this.jmxEnvironment = new HashMap(); + this.jmxEnvironment.put(JMXConnector.CREDENTIALS, new String[]{ jmxUsername, jmxPassword }); + } else { + this.jmxEnvironment = emptyMap(); + } + + if ((jmsUsername != null) && (jmsPassword != null)) { + this.jmsFactory = new ActiveMQJMSConnectionFactory(jmsUrl, jmsUsername, jmsPassword); + } else { + this.jmsFactory = new ActiveMQJMSConnectionFactory(jmsUrl); + } + } + @Override - public List messagesOf(final String host, final String port, final String brokerName, final String destinationName) throws Exception { - return jmsProcessor.process(host, port, destinationName, jmsManagement.browseMessages()); + public List messagesOf(final String destinationName) throws Exception { + return jmsProcessor.process(this.jmsFactory, destinationName, jmsManagement.browseMessages()); } @Override - public long remove(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception { - return jmxProcessor.processQueueControl(host, port, brokerName, destinationName, jmxManagement.removeMessages(msgIds)); + public long remove(final String destinationName, final Iterator msgIds) throws Exception { + return jmxProcessor.processQueueControl(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.removeMessages(msgIds)).collect( + summingLong(Long::longValue)); } @Override - public long reprocess(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception { - return jmxProcessor.processQueueControl(host, port, brokerName, destinationName, jmxManagement.reprocessMessages(msgIds)); + public long reprocess(final String destinationName, final Iterator msgIds) throws Exception { + return jmxProcessor.processQueueControl( + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.reprocessMessages(msgIds)).collect( + summingLong(Long::longValue)); } @Override - public String[] queueNames(final String host, final String port, final String brokerName) throws Exception { - return jmxProcessor.processServerControl(host, port, brokerName, JMSServerControl::getQueueNames); + public List queueNames() throws Exception { + return jmxProcessor.processServerControl( + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + JMSServerControl::getQueueNames).flatMap( + l -> Arrays.stream(l)).sorted(). + distinct().collect(toList()); } + @Override - public Map queueMessageCount(final String host, final String port, final String brokerName, final String[] queueNames) throws Exception { - return jmxProcessor.processQueues(host, port, brokerName, queueNames, unchecked(DestinationControl::getMessageCount)); + public Map queueMessageCount(final Collection queueNames) throws Exception { + return jmxProcessor.processQueues(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + queueNames, + unchecked(DestinationControl::getMessageCount)).flatMap( + m -> m.entrySet().stream()).collect( + groupingBy(Entry::getKey, + summingLong(Entry::getValue))); } @Override - public String[] topicNames(final String host, final String port, final String brokerName) throws Exception { - return jmxProcessor.processServerControl(host, port, brokerName, JMSServerControl::getTopicNames); + public List topicNames() throws Exception { + return jmxProcessor.processServerControl(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + JMSServerControl::getTopicNames).flatMap( + l -> Arrays.stream(l)).sorted(). + distinct().collect(toList()); } @Override - public Map topicMessageCount(final String host, final String port, final String brokerName, final String[] topicNames) throws Exception { - return jmxProcessor.processTopics(host, port, brokerName, topicNames, unchecked(DestinationControl::getMessageCount)); + public Map topicMessageCount(final Collection topicNames) throws Exception { + return jmxProcessor.processTopics(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + topicNames, + unchecked(DestinationControl::getMessageCount)).flatMap( + m -> m.entrySet().stream()).collect( + groupingBy(Entry::getKey, + summingLong(Entry::getValue))); } } \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java index bc2ae27..9d26fb8 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java @@ -1,55 +1,133 @@ package uk.gov.justice.artemis.manager.connector; +import static java.util.Collections.emptyMap; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.summingLong; +import static java.util.stream.Collectors.toList; import static pl.touk.throwing.ThrowingFunction.unchecked; +import uk.gov.justice.artemis.manager.connector.jmx.JmxManagement; +import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; +import uk.gov.justice.output.ConsolePrinter; + +import java.net.MalformedURLException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXServiceURL; + +import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; import org.apache.activemq.artemis.api.jms.management.DestinationControl; import org.apache.activemq.artemis.api.jms.management.JMSServerControl; -import uk.gov.justice.artemis.manager.connector.jmx.JmxManagement; -import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; -import uk.gov.justice.output.ConsolePrinter; - public class JmxArtemisConnector implements ArtemisConnector { private final JmxProcessor jmxProcessor = new JmxProcessor(); private final JmxManagement jmxManagement = new JmxManagement(new ConsolePrinter()); + private List jmxServiceUrls; + private Map jmxEnvironment; + private ObjectNameBuilder objectNameBuilder; + @Override - public List messagesOf(final String host, final String port, final String brokerName, final String destinationName) throws Exception { - return jmxProcessor.processQueueControl(host, port, brokerName, destinationName, jmxManagement.browseMessages()); + public void setParameters(final List jmxUrls, + final String brokerName, + final String jmxUsername, + final String jmxPassword, + final String jmsUrl, + final String jmsUsername, + final String jmsPassword) throws MalformedURLException { + this.jmxServiceUrls = jmxProcessor.processJmxUrls(jmxUrls); + this.objectNameBuilder = jmxProcessor.getObjectNameBuilder(brokerName); + + if ((jmxUsername != null) && (jmxPassword != null)) { + this.jmxEnvironment = new HashMap(); + this.jmxEnvironment.put(JMXConnector.CREDENTIALS, new String[]{ jmxUsername, jmxPassword }); + } else { + this.jmxEnvironment = emptyMap(); + } } @Override - public long remove(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception { - return jmxProcessor.processQueueControl(host, port, brokerName, destinationName, jmxManagement.removeMessages(msgIds)); + public List messagesOf(final String destinationName) throws Exception { + return jmxProcessor.processQueueControl(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.browseMessages()).flatMap( + l -> l.stream()).collect(toList()); } @Override - public long reprocess(final String host, final String port, final String brokerName, final String destinationName, final Iterator msgIds) throws Exception { - return jmxProcessor.processQueueControl(host, port, brokerName, destinationName, jmxManagement.reprocessMessages(msgIds)); + public long remove(final String destinationName, final Iterator msgIds) throws Exception { + return jmxProcessor.processQueueControl(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.removeMessages(msgIds)).collect( + summingLong(Long::longValue)); } @Override - public String[] queueNames(final String host, final String port, final String brokerName) throws Exception { - return jmxProcessor.processServerControl(host, port, brokerName, JMSServerControl::getQueueNames); + public long reprocess(final String destinationName, final Iterator msgIds) throws Exception { + return jmxProcessor.processQueueControl( + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.reprocessMessages(msgIds)).collect( + summingLong(Long::longValue)); } @Override - public Map queueMessageCount(final String host, final String port, final String brokerName, final String[] queueNames) throws Exception { - return jmxProcessor.processQueues(host, port, brokerName, queueNames, unchecked(DestinationControl::getMessageCount)); + public List queueNames() throws Exception { + return jmxProcessor.processServerControl( + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + JMSServerControl::getQueueNames).flatMap( + l -> Arrays.stream(l)).sorted(). + distinct().collect(toList()); + } + + + @Override + public Map queueMessageCount(final Collection queueNames) throws Exception { + return jmxProcessor.processQueues(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + queueNames, + unchecked(DestinationControl::getMessageCount)).flatMap( + m -> m.entrySet().stream()).collect( + groupingBy(Entry::getKey, + summingLong(Entry::getValue))); } @Override - public String[] topicNames(final String host, final String port, final String brokerName) throws Exception { - return jmxProcessor.processServerControl(host, port, brokerName, JMSServerControl::getTopicNames); + public List topicNames() throws Exception { + return jmxProcessor.processServerControl(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + JMSServerControl::getTopicNames).flatMap( + l -> Arrays.stream(l)).sorted(). + distinct().collect(toList()); } @Override - public Map topicMessageCount(final String host, final String port, final String brokerName, final String[] topicNames) throws Exception { - return jmxProcessor.processTopics(host, port, brokerName, topicNames, unchecked(DestinationControl::getMessageCount)); + public Map topicMessageCount(final Collection topicNames) throws Exception { + return jmxProcessor.processTopics(this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + topicNames, + unchecked(DestinationControl::getMessageCount)).flatMap( + m -> m.entrySet().stream()).collect( + groupingBy(Entry::getKey, + summingLong(Entry::getValue))); } -} +} \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagement.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagement.java index d7f59e0..1d7a706 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagement.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagement.java @@ -20,7 +20,7 @@ public class JmsManagement { public JmsManagementFunction> browseMessages() { return queueBrowser -> { try { - final Enumeration browserEnumeration = queueBrowser.getEnumeration(); + final Enumeration browserEnumeration = queueBrowser.getEnumeration(); final ArrayList messages = new ArrayList<>(); diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java index 7bac419..f5acb5f 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java @@ -1,7 +1,5 @@ package uk.gov.justice.artemis.manager.connector.jms; -import static java.lang.String.format; - import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueBrowser; @@ -10,25 +8,21 @@ import javax.jms.Session; import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; -import org.apache.activemq.artemis.jms.client.ActiveMQQueueConnectionFactory; +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; public class JmsProcessor { - private static final String JMS_URL = "tcp://%s:%s"; - - public T process(final String host, - final String port, - final String destinationName, - final JmsManagementFunction jmsManagementFunction) throws JMSException { + public T process(ActiveMQJMSConnectionFactory factory, + final String destinationName, + final JmsManagementFunction jmsManagementFunction) throws JMSException { - final Queue queue = ActiveMQJMSClient.createQueue(destinationName); + final Queue queue = ActiveMQJMSClient.createQueue(destinationName); - try (final ActiveMQQueueConnectionFactory connectionFactory = new ActiveMQQueueConnectionFactory(format(JMS_URL, host, port)); - final QueueConnection queueConnection = connectionFactory.createQueueConnection(); - final QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); - final QueueBrowser queueBrowser = queueSession.createBrowser(queue)) { + try (final QueueConnection queueConnection = factory.createQueueConnection(); + final QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); + final QueueBrowser queueBrowser = queueSession.createBrowser(queue)) { - return jmsManagementFunction.apply(queueBrowser); - } + return jmsManagementFunction.apply(queueBrowser); + } } -} +} \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java index 72e57ab..fb9a8a8 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java @@ -1,16 +1,18 @@ package uk.gov.justice.artemis.manager.connector.jmx; -import static java.lang.String.format; -import static java.util.Collections.emptyMap; import static java.util.stream.Collectors.toMap; import static javax.management.MBeanServerInvocationHandler.newProxyInstance; import static javax.management.remote.JMXConnectorFactory.connect; import static org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration.getDefaultJmxDomain; +import static pl.touk.throwing.ThrowingFunction.unchecked; import java.io.IOException; -import java.util.Arrays; +import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.management.ObjectName; import javax.management.remote.JMXConnector; @@ -23,97 +25,144 @@ public class JmxProcessor { - private static final String JMX_URL = "service:jmx:rmi:///jndi/rmi://%s:%s/jmxrmi"; + public List processJmxUrls(final Collection jmxUrls) { + return jmxUrls.stream().map(unchecked(JMXServiceURL::new)).collect(Collectors.toList()); + } - public T processQueueControl(final String host, - final String port, - final String brokerName, - final String destinationName, - final JmxManagementFunction jmxManagementFunction) throws Exception { + public ObjectNameBuilder getObjectNameBuilder(String brokerName) { + return ObjectNameBuilder.create(getDefaultJmxDomain(), brokerName, true); + } - try (final JMXConnector connector = getJMXConnector(host, port)) { - final JMSQueueControl queueControl = queueControlOf(connector, brokerName, destinationName); + public T processQueueControl( + final JMXConnector connector, + final ObjectNameBuilder onb, + final String destinationName, + final JmxManagementFunction jmxManagementFunction) throws Exception { - return jmxManagementFunction.apply(queueControl); - } + final JMSQueueControl queueControl = queueControlOf(connector, onb, destinationName); + return jmxManagementFunction.apply(queueControl); } - public T processServerControl(final String host, - final String port, - final String brokerName, - final Function fn) throws Exception { + public Stream processQueueControl( + final List serviceUrls, + final Map env, + final ObjectNameBuilder onb, + final String destinationName, + final JmxManagementFunction jmxManagementFunction) throws Exception { + + return serviceUrls.stream().map(s -> { + try (final JMXConnector connector = getJMXConnector(s, env)) { + return processQueueControl(connector, onb, destinationName, jmxManagementFunction); + } catch (Exception e) { + throw new RuntimeException(e); + }}); + } - try (final JMXConnector connector = getJMXConnector(host, port)) { - final JMSServerControl serverControl = serverControlOf(connector, brokerName); + public T processServerControl(final JMXConnector connector, + final ObjectNameBuilder onb, + final Function fn) throws Exception { - return fn.apply(serverControl); - } + final JMSServerControl serverControl = serverControlOf(connector, onb); + return fn.apply(serverControl); } - public Map processQueues(final String host, - final String port, - final String brokerName, - final String[] destinations, - final Function fn) throws Exception { - try (final JMXConnector connector = getJMXConnector(host, port)) { - return Arrays.stream(destinations).collect(toMap(Function.identity(), destination -> { - try { - return processQueueControl(connector, brokerName, destination, fn); - } catch (Exception e) { - throw new RuntimeException(e); - } - })); - } - } - - public Map processTopics(final String host, - final String port, - final String brokerName, - final String[] destinations, - final Function fn) throws Exception { - try (final JMXConnector connector = getJMXConnector(host, port)) { - return Arrays.stream(destinations).collect(toMap(Function.identity(), destination -> { - try { - return processTopicControl(connector, brokerName, destination, fn); - } catch (Exception e) { - throw new RuntimeException(e); - } + public Stream processServerControl(final List serviceUrls, + final Map env, + final ObjectNameBuilder onb, + final Function fn) throws Exception { + + return serviceUrls.stream().map(s -> { + try (final JMXConnector connector = getJMXConnector(s, env)) { + return processServerControl(connector, onb, fn); + } catch (Exception e) { + throw new RuntimeException(e); + }}); + } + + public Map processQueues(final JMXConnector connector, + final ObjectNameBuilder onb, + final Collection destinations, + final Function fn) throws Exception { + return destinations.stream().collect(toMap(Function.identity(), destination -> { + try { + return processQueueControl(connector, onb, destination, fn); + } catch (Exception e) { + throw new RuntimeException(e); + } })); - } } - private JMXConnector getJMXConnector(final String host, final String port) throws IOException { - return connect(new JMXServiceURL(format(JMX_URL, host, port)), emptyMap()); + public Stream> processQueues(final List serviceUrls, + final Map env, + final ObjectNameBuilder onb, + final Collection destinations, + final Function fn) throws Exception { + return serviceUrls.stream().map(s -> { + try (final JMXConnector connector = getJMXConnector(s, env)) { + return processQueues(connector, onb, destinations, fn); + } catch (Exception e) { + throw new RuntimeException(e); + }}); } - private JMSQueueControl queueControlOf(final JMXConnector connector, final String brokerName, final String destinationName) throws Exception { - final ObjectName on = ObjectNameBuilder.create(getDefaultJmxDomain(), brokerName, true).getJMSQueueObjectName(destinationName); + public Map processTopics(JMXConnector connector, + final ObjectNameBuilder onb, + final Collection destinations, + final Function fn) throws Exception { + return destinations.stream().collect(toMap(Function.identity(), destination -> { + try { + return processTopicControl(connector, onb, destination, fn); + } catch (Exception e) { + throw new RuntimeException(e); + } + })); + } + + public Stream> processTopics(final List serviceUrls, + final Map env, + final ObjectNameBuilder onb, + final Collection destinations, + final Function fn) throws Exception { + return serviceUrls.stream().map(s -> { + try (final JMXConnector connector = getJMXConnector(s, env)) { + return processTopics(connector, onb, destinations, fn); + } catch (Exception e) { + throw new RuntimeException(e); + }}); + } + + private JMXConnector getJMXConnector(final JMXServiceURL jmxServiceUrl, final Map env) throws IOException { + return connect(jmxServiceUrl, env); + } + + private JMSQueueControl queueControlOf(final JMXConnector connector, final ObjectNameBuilder onb, final String destinationName) throws Exception { + final ObjectName on = onb.getJMSQueueObjectName(destinationName); return newProxyInstance(connector.getMBeanServerConnection(), on, JMSQueueControl.class, false); } - private TopicControl topicControlOf(final JMXConnector connector, final String brokerName, final String destinationName) throws Exception { - final ObjectName on = ObjectNameBuilder.create(getDefaultJmxDomain(), brokerName, true).getJMSTopicObjectName(destinationName); + private TopicControl topicControlOf(final JMXConnector connector, final ObjectNameBuilder onb, final String destinationName) throws Exception { + final ObjectName on = onb.getJMSTopicObjectName(destinationName); return newProxyInstance(connector.getMBeanServerConnection(), on, TopicControl.class, false); } - private JMSServerControl serverControlOf(final JMXConnector connector, final String brokerName) throws Exception { - final ObjectName on = ObjectNameBuilder.create(getDefaultJmxDomain(), brokerName, true).getJMSServerObjectName(); + private JMSServerControl serverControlOf(final JMXConnector connector, final ObjectNameBuilder onb) throws Exception { + final ObjectName on = onb.getJMSServerObjectName(); return newProxyInstance(connector.getMBeanServerConnection(), on, JMSServerControl.class, false); } private T processQueueControl(final JMXConnector connector, - final String brokerName, - final String destination, - final Function fn) throws Exception { - final JMSQueueControl queueControl = queueControlOf(connector, brokerName, destination); + final ObjectNameBuilder onb, + final String destination, + final Function fn) throws Exception { + final JMSQueueControl queueControl = queueControlOf(connector, onb, destination); return fn.apply(queueControl); } private T processTopicControl(final JMXConnector connector, - final String brokerName, + final ObjectNameBuilder onb, final String destination, final Function fn) throws Exception { - final TopicControl topicControl = topicControlOf(connector, brokerName, destination); + final TopicControl topicControl = topicControlOf(connector, onb, destination); return fn.apply(topicControl); } } \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java b/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java index 0340f22..ab6ae4e 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java @@ -5,20 +5,51 @@ import uk.gov.justice.output.ConsolePrinter; import uk.gov.justice.output.OutputPrinter; +import java.util.Arrays; +import java.util.List; + import com.beust.jcommander.Parameter; abstract class AbstractArtemisCommand { + static public final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"; + static public final String DEFAULT_BROKER_NAME = "default"; + static public final String DEFAULT_JMS_URL = "tcp://localhost:61616?clientID=artemis-manager"; + + final OutputPrinter outputPrinter = new ConsolePrinter(); ArtemisConnector artemisConnector = new CombinedJmsAndJmxArtemisConnector(); - final OutputPrinter outputPrinter = new ConsolePrinter(); + @Parameter(names = "-jmxUrl", description = "Full JMX URLs, can be specified mulitple times (default: " + DEFAULT_JMX_URL + ")", variableArity = true) + List jmxURLs = Arrays.asList(DEFAULT_JMX_URL); + + @Parameter(names = {"-brokerName", "-jmxBrokerName"}, description = "broker name as specified in broker.xml (default: " + DEFAULT_BROKER_NAME + ")") + String brokerName = DEFAULT_BROKER_NAME; + + @Parameter(names = "-jmxUsername", description = "JMX Username (optional)") + String jmxUsername; + + @Parameter(names = "-jmxPassword", description = "JMX Password (optional)") + String jmxPassword; + + @Parameter(names = "-jmsUrl", description = "Full JMS URL (default: " + DEFAULT_JMS_URL + ")") + String jmsURL = DEFAULT_JMS_URL; + + @Parameter(names = "-jmsUsername", description = "JMS Username (optional)") + String jmsUsername; - @Parameter(names = "-host", description = "ip address of artemis node", required = true) - String host; + @Parameter(names = "-jmsPassword", description = "JMS Password (optional)") + String jmsPassword; - @Parameter(names = "-port", description = "jmx port", required = true) - String port; + @Parameter(names = "-help", help = true) + private boolean help; - @Parameter(names = "-brokerName", description = "broker name as specified in broker.xml", required = true) - String brokerName; -} + public void setup() throws Exception { + artemisConnector.setParameters(this.jmxURLs, + this.brokerName, + this.jmxUsername, + this.jmxPassword, + this.jmsURL, + this.jmsUsername, + this.jmsPassword); + } +} \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/framework/tools/command/Browse.java b/src/main/java/uk/gov/justice/framework/tools/command/Browse.java index 77701aa..1c3f874 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/Browse.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/Browse.java @@ -10,9 +10,10 @@ public class Browse extends AbstractArtemisCommand implements ShellCommand { @Override public void run(final String[] args) { - try { - final List messageData = artemisConnector.messagesOf(host, port, brokerName, "DLQ"); + super.setup(); + + final List messageData = artemisConnector.messagesOf("DLQ"); outputPrinter.writeMessages(messageData); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); diff --git a/src/main/java/uk/gov/justice/framework/tools/command/ListQueues.java b/src/main/java/uk/gov/justice/framework/tools/command/ListQueues.java index 3e202a0..dfd7f56 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/ListQueues.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/ListQueues.java @@ -2,14 +2,17 @@ import uk.gov.justice.framework.tools.common.command.ShellCommand; +import java.util.List; + public class ListQueues extends AbstractArtemisCommand implements ShellCommand { @Override public void run(final String[] args) { try { - final String[] queues = artemisConnector.queueNames(host, port, brokerName); - outputPrinter.writeStringArray(queues); + super.setup(); + final List queues = artemisConnector.queueNames(); + outputPrinter.writeStringCollection(queues); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); } diff --git a/src/main/java/uk/gov/justice/framework/tools/command/ListTopics.java b/src/main/java/uk/gov/justice/framework/tools/command/ListTopics.java index abbb7de..4c43ce8 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/ListTopics.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/ListTopics.java @@ -2,14 +2,17 @@ import uk.gov.justice.framework.tools.common.command.ShellCommand; +import java.util.List; + public class ListTopics extends AbstractArtemisCommand implements ShellCommand { @Override public void run(final String[] args) { try { - final String[] queues = artemisConnector.topicNames(host, port, brokerName); - outputPrinter.writeStringArray(queues); + super.setup(); + final List queues = artemisConnector.topicNames(); + outputPrinter.writeStringCollection(queues); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); } diff --git a/src/main/java/uk/gov/justice/framework/tools/command/QueueMessageCounts.java b/src/main/java/uk/gov/justice/framework/tools/command/QueueMessageCounts.java index 9ed182e..ec8a158 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/QueueMessageCounts.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/QueueMessageCounts.java @@ -1,17 +1,19 @@ package uk.gov.justice.framework.tools.command; -import java.util.Map; - import uk.gov.justice.framework.tools.common.command.ShellCommand; +import java.util.List; +import java.util.Map; + public class QueueMessageCounts extends AbstractArtemisCommand implements ShellCommand { @Override public void run(final String[] args) { try { - final String[] queues = artemisConnector.queueNames(host, port, brokerName); - final Map counts = artemisConnector.queueMessageCount(host, port, brokerName, queues); + super.setup(); + final List queues = artemisConnector.queueNames(); + final Map counts = artemisConnector.queueMessageCount(queues); outputPrinter.writeMap(counts, "messageCount"); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); diff --git a/src/main/java/uk/gov/justice/framework/tools/command/Remove.java b/src/main/java/uk/gov/justice/framework/tools/command/Remove.java index 9deb392..b6e40a9 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/Remove.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/Remove.java @@ -12,13 +12,18 @@ public class Remove extends AbstractMsgIdConsumingArtemisCommand implements Shel @Override public void run(final String[] strings) { - long removedMessages = removeMessagesOf(singleMessageIdProvided() ? singletonList(msgId).iterator() : new Scanner(System.in)); - outputPrinter.writeCommandResult("Remove message", removedMessages); + try { + super.setup(); + long removedMessages = removeMessagesOf(singleMessageIdProvided() ? singletonList(msgId).iterator() : new Scanner(System.in)); + outputPrinter.writeCommandResult("Remove message", removedMessages); + } catch(final Exception e) { + outputPrinter.writeStackTrace(e); + } } private long removeMessagesOf(final Iterator msgIds) { try { - return artemisConnector.remove(host, port, brokerName, "DLQ", msgIds); + return artemisConnector.remove("DLQ", msgIds); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); return 0; diff --git a/src/main/java/uk/gov/justice/framework/tools/command/Reprocess.java b/src/main/java/uk/gov/justice/framework/tools/command/Reprocess.java index 8f1470a..ae8e1bc 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/Reprocess.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/Reprocess.java @@ -12,13 +12,18 @@ public class Reprocess extends AbstractMsgIdConsumingArtemisCommand implements S @Override public void run(final String[] strings) { - long reprocessedMessages = reprocessMessagesOf(singleMessageIdProvided() ? singletonList(msgId).iterator() : new Scanner(System.in)); - outputPrinter.writeCommandResult("Reprocess message", reprocessedMessages); + try { + super.setup(); + long reprocessedMessages = reprocessMessagesOf(singleMessageIdProvided() ? singletonList(msgId).iterator() : new Scanner(System.in)); + outputPrinter.writeCommandResult("Reprocess message", reprocessedMessages); + } catch (final Exception e) { + outputPrinter.writeStackTrace(e); + } } private long reprocessMessagesOf(final Iterator msgIds) { try { - return artemisConnector.reprocess(host, port, brokerName, "DLQ", msgIds); + return artemisConnector.reprocess("DLQ", msgIds); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); return 0; diff --git a/src/main/java/uk/gov/justice/framework/tools/command/TopicMessageCounts.java b/src/main/java/uk/gov/justice/framework/tools/command/TopicMessageCounts.java index 8833a92..21f48fe 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/TopicMessageCounts.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/TopicMessageCounts.java @@ -1,17 +1,19 @@ package uk.gov.justice.framework.tools.command; -import java.util.Map; - import uk.gov.justice.framework.tools.common.command.ShellCommand; +import java.util.List; +import java.util.Map; + public class TopicMessageCounts extends AbstractArtemisCommand implements ShellCommand { @Override public void run(final String[] args) { try { - final String[] topics = artemisConnector.topicNames(host, port, brokerName); - final Map counts = artemisConnector.topicMessageCount(host, port, brokerName, topics); + super.setup(); + final List topics = artemisConnector.topicNames(); + final Map counts = artemisConnector.topicMessageCount(topics); outputPrinter.writeMap(counts, "messageCount"); } catch (final Exception exception) { outputPrinter.writeStackTrace(exception); diff --git a/src/main/java/uk/gov/justice/framework/tools/common/command/Bootstrap.java b/src/main/java/uk/gov/justice/framework/tools/common/command/Bootstrap.java index 7fec0d2..026b544 100644 --- a/src/main/java/uk/gov/justice/framework/tools/common/command/Bootstrap.java +++ b/src/main/java/uk/gov/justice/framework/tools/common/command/Bootstrap.java @@ -20,6 +20,7 @@ public class Bootstrap { private Bootstrap() { this.commander = new JCommander(); this.commander.setAcceptUnknownOptions(true); + this.commander.setAllowAbbreviatedOptions(true); } public static void main(final String... args) { diff --git a/src/main/java/uk/gov/justice/output/ConsolePrinter.java b/src/main/java/uk/gov/justice/output/ConsolePrinter.java index 313d6c6..ca882be 100644 --- a/src/main/java/uk/gov/justice/output/ConsolePrinter.java +++ b/src/main/java/uk/gov/justice/output/ConsolePrinter.java @@ -2,6 +2,7 @@ import uk.gov.justice.artemis.manager.connector.MessageData; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -23,7 +24,7 @@ public void writeCommandResult(final String command, final long count) { } @Override - public void writeStringArray(final String[] items) { + public void writeStringCollection(final Collection items) { System.out.println(jsonStringOf(items)); } @@ -70,11 +71,9 @@ private String jsonStringOf(final List messageData) { return jsonResponse.build().toString(); } - private String jsonStringOf(final String[] items) { + private String jsonStringOf(final Collection items) { final JsonArrayBuilder jsonResponse = Json.createArrayBuilder(); - for (String item : items) { - jsonResponse.add(item); - } + items.stream().forEach(jsonResponse::add); return jsonResponse.build().toString(); } diff --git a/src/main/java/uk/gov/justice/output/OutputPrinter.java b/src/main/java/uk/gov/justice/output/OutputPrinter.java index d748901..ab89ba0 100644 --- a/src/main/java/uk/gov/justice/output/OutputPrinter.java +++ b/src/main/java/uk/gov/justice/output/OutputPrinter.java @@ -2,6 +2,7 @@ import uk.gov.justice.artemis.manager.connector.MessageData; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -21,10 +22,10 @@ public interface OutputPrinter { public void writeCommandResult(final String command, final long count); /** - * Writes a list of Strings to the output in JSON Array style + * Writes a Collection of Strings to the output in JSON Array style * @param items - the list of items to be written */ - public void writeStringArray(final String[] items); + public void writeStringCollection(final Collection items); /** * Writes a list of Strings to the output in JSON Array style diff --git a/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java b/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java index 2e4ed04..c774391 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java @@ -1,7 +1,6 @@ package uk.gov.justice.artemis.manager; import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.hasSize; @@ -18,19 +17,20 @@ import javax.jms.JMSException; -import com.jayway.jsonpath.JsonPath; import org.apache.commons.io.IOUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import com.jayway.jsonpath.JsonPath; + //to run this test from IDE start artemis first by executing ./target/server0/bin/artemis run public class ArtemisManagerIT { private static final String DLQ = "DLQ"; - private static final String COMMAND_LINE_BROWSE = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar browse -host localhost -port 61616 -brokerName 0.0.0.0"; - private static final String COMMAND_LINE_REPROCESS = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar reprocess -host localhost -port 3000 -brokerName 0.0.0.0"; - private static final String COMMAND_LINE_REMOVE = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar remove -host localhost -port 3000 -brokerName 0.0.0.0"; + private static final String COMMAND_LINE_BROWSE = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar browse -brokerName 0.0.0.0 -jmxUrl service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi -jmsUrl tcp://localhost:61616?clientID=artemis-manager"; + private static final String COMMAND_LINE_REPROCESS = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar reprocess -brokerName 0.0.0.0 -jmxUrl service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi -jmsUrl tcp://localhost:61616?clientID=artemis-manager"; + private static final String COMMAND_LINE_REMOVE = "env -u _JAVA_OPTIONS java -jar target/artemis-manager.jar remove -brokerName 0.0.0.0 -jmxUrl service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi -jmsUrl tcp://localhost:61616?clientID=artemis-manager"; @BeforeClass public static void beforeClass() throws JMSException { @@ -64,29 +64,8 @@ public void shouldBrowseMessagesInDLQ() throws Exception { assertThat(standardOutput, hasJsonPath("$[1].originalDestination", equalTo("jms.queue.hocuspocus"))); assertThat(standardOutput, hasJsonPath("$[1].msgContent._metadata.name", equalTo("some.other.name"))); assertThat(standardOutput, hasJsonPath("$[1].msgContent._metadata.id", equalTo("c97c5b7b-abc3-49d4-96a9-bcd83aa4ea13"))); - - } - - @Test - public void shouldThrowExceptionIfHostMissingWhenBrowsing() throws IOException { - assertThat(errorOutputOf("java -jar target/artemis-manager.jar browse -port 3000 -brokerName 0.0.0.0"), - containsString("The following option is required: -host")); - } - - - @Test - public void shouldThrowExceptionIfPortMissingWhenBrowsing() throws IOException { - assertThat(errorOutputOf("java -jar target/artemis-manager.jar browse -host localhost -brokerName 0.0.0.0"), - containsString("The following option is required: -port")); - } - - @Test - public void shouldThrowExceptionIfBrokerNameMissingWhenBrowsing() throws IOException { - assertThat(errorOutputOf("java -jar target/artemis-manager.jar browse -host localhost -port 3000"), - containsString("The following option is required: -brokerName")); } - @Test public void shouldRemoveMessageById() throws Exception { @@ -104,7 +83,6 @@ public void shouldRemoveMessageById() throws Exception { assertThat(messageDataAfterRemoval, hasJsonPath("$..msgId", hasSize(1))); assertThat(messageDataAfterRemoval, hasJsonPath("$[0].msgId", equalTo(msgIds.get(1)))); - } @Test diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java b/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java index f87444d..5658358 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java @@ -1,7 +1,7 @@ package uk.gov.justice.artemis.manager.connector; import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.arrayContainingInAnyOrder; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -15,17 +15,20 @@ import static uk.gov.justice.artemis.manager.util.JmsTestUtil.putInQueue; import java.io.ByteArrayInputStream; +import java.net.MalformedURLException; +import java.util.Arrays; import java.util.List; import javax.jms.JMSException; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class CombinedJmsAndJmxArtemisConnectorIT { - private ArtemisConnector combinedArtemisConnector = new CombinedJmsAndJmxArtemisConnector(); + private ArtemisConnector combinedArtemisConnector; @BeforeClass public static void beforeClass() throws JMSException { @@ -37,6 +40,20 @@ public static void afterClass() throws JMSException { closeJmsConnection(); } + @Before + public void setUp() throws MalformedURLException { + this.combinedArtemisConnector = new CombinedJmsAndJmxArtemisConnector(); + this.combinedArtemisConnector.setParameters( + Arrays.asList("service:jmx:rmi://localhost:3000/jndi/rmi://localhost:3000/jmxrmi"), + "0.0.0.0", + null, + null, + "tcp://localhost:61616?clientID=artemis-manager", + null, + null + ); + } + @Test public void shouldReturnMessagesFromQueue() throws Exception { final String queue = "DLQ"; @@ -46,7 +63,7 @@ public void shouldReturnMessagesFromQueue() throws Exception { putInQueue(queue, "{\"key1\":\"value123\"}", "origQueueO1"); putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(2)); assertThat(messageData.get(0).getMsgId(), not(nullValue())); assertThat(messageData.get(0).getOriginalDestination(), is("origQueueO1")); @@ -67,7 +84,7 @@ public void shouldReturnUnsupportedMessageTextForByteMessage() throws Exception putInQueue(queue, messageInput, "origQueueO1"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(1)); assertThat(messageData.get(0).getMsgId(), not(nullValue())); assertThat(messageData.get(0).getOriginalDestination(), is("origQueueO1")); @@ -84,12 +101,12 @@ public void shouldRemoveMessagesFromQueue() throws Exception { putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); putInQueue(queue, "{\"key1\":\"valueCC\"}", "origQueueO3"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(3)); - combinedArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList(messageData.get(1).getMsgId(), messageData.get(2).getMsgId()).iterator()); + combinedArtemisConnector.remove(queue, asList(messageData.get(1).getMsgId(), messageData.get(2).getMsgId()).iterator()); - final List messageDataAfterRemoval = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageDataAfterRemoval = combinedArtemisConnector.messagesOf(queue); assertThat(messageDataAfterRemoval, hasSize(1)); assertThat(messageDataAfterRemoval.get(0).getMsgId(), is(messageData.get(0).getMsgId())); @@ -104,12 +121,12 @@ public void shouldIgnoreMessagesNotInTheQueue() throws Exception { putInQueue(queue, "{\"key1\":\"value123\"}", "origQueueO1"); putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(2)); - combinedArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList("id_does_not_exist_123", messageData.get(1).getMsgId()).iterator()); + combinedArtemisConnector.remove(queue, asList("id_does_not_exist_123", messageData.get(1).getMsgId()).iterator()); - final List messageDataAfterRemoval = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageDataAfterRemoval = combinedArtemisConnector.messagesOf(queue); assertThat(messageDataAfterRemoval, hasSize(1)); assertThat(messageDataAfterRemoval.get(0).getMsgId(), is(messageData.get(0).getMsgId())); @@ -125,11 +142,10 @@ public void shouldReturnNumberOfDeletedMessages() throws Exception { putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); putInQueue(queue, "{\"key1\":\"valueCC\"}", "origQueueO3"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); - final long removedMessages = combinedArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList(messageData.get(1).getMsgId(), "unknown_id", messageData.get(2).getMsgId()).iterator()); + final long removedMessages = combinedArtemisConnector.remove(queue, asList(messageData.get(1).getMsgId(), "unknown_id", messageData.get(2).getMsgId()).iterator()); assertThat(removedMessages, is(2L)); - } @Test @@ -141,11 +157,11 @@ public void shouldReprocessMessageOntoOriginalQueue() throws Exception { putInQueue(queue, "{\"key1\":\"value123\"}", "origQueueO1"); putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); - final List messageData = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageData = combinedArtemisConnector.messagesOf(queue); - final long reprocessedMessages = combinedArtemisConnector.reprocess("localhost", "3000", "0.0.0.0", queue, asList(messageData.get(0).getMsgId(), messageData.get(1).getMsgId()).iterator()); + final long reprocessedMessages = combinedArtemisConnector.reprocess(queue, asList(messageData.get(0).getMsgId(), messageData.get(1).getMsgId()).iterator()); - final List messageDataAfter = combinedArtemisConnector.messagesOf("localhost", "61616", "0.0.0.0", queue); + final List messageDataAfter = combinedArtemisConnector.messagesOf(queue); assertThat(reprocessedMessages, is(2L)); assertThat(messageDataAfter, is(empty())); @@ -153,8 +169,8 @@ public void shouldReprocessMessageOntoOriginalQueue() throws Exception { @Test public void shouldReturnListOfQueues() throws Exception { - final String[] queueNames = combinedArtemisConnector.queueNames("localhost", "3000", "0.0.0.0"); - assertThat(queueNames, arrayContainingInAnyOrder("DLQ", "ExpiryQueue")); + final List queueNames = combinedArtemisConnector.queueNames(); + assertThat(queueNames, contains("DLQ", "ExpiryQueue")); } @Test @@ -163,8 +179,9 @@ public void shouldReturnListOfTopics() throws Exception { cleanTopic(topic, "testSubscription"); - final String[] topicNames = combinedArtemisConnector.topicNames("localhost", "3000", "0.0.0.0"); - assertThat(topicNames, arrayContainingInAnyOrder("testTopic")); + final List topicNames = combinedArtemisConnector.topicNames(); + + assertThat(topicNames, contains("testTopic")); } -} +} \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java b/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java index 280954f..017bf09 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java @@ -1,7 +1,7 @@ package uk.gov.justice.artemis.manager.connector; import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.arrayContainingInAnyOrder; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -15,12 +15,14 @@ import static uk.gov.justice.artemis.manager.util.JmsTestUtil.putInQueue; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.putOnTopic; +import java.net.MalformedURLException; import java.util.List; import java.util.Map; import javax.jms.JMSException; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -30,7 +32,7 @@ public class JmxArtemisConnectorIT { private Logger logger = LoggerFactory.getLogger(JmxArtemisConnectorIT.class); - private ArtemisConnector jmxArtemisConnector = new JmxArtemisConnector(); + private ArtemisConnector jmxArtemisConnector; @BeforeClass public static void beforeClass() throws JMSException { @@ -42,6 +44,20 @@ public static void afterClass() throws JMSException { closeJmsConnection(); } + @Before + public void setUp() throws MalformedURLException { + this.jmxArtemisConnector = new JmxArtemisConnector(); + this.jmxArtemisConnector.setParameters( + asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"), + "0.0.0.0", + null, + null, + null, + null, + null + ); + } + @Test public void shouldReturnMessagesFromQueue() throws Exception { final String queue = "DLQ"; @@ -51,7 +67,7 @@ public void shouldReturnMessagesFromQueue() throws Exception { putInQueue(queue, "{\"key1\":\"value123\"}", "origQueueO1"); putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); - final List messageData = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageData = jmxArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(2)); assertThat(messageData.get(0).getMsgId(), not(nullValue())); assertThat(messageData.get(0).getOriginalDestination(), is("origQueueO1")); @@ -72,15 +88,15 @@ public void shouldRemoveMessagesFromQueue() throws Exception { putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); putInQueue(queue, "{\"key1\":\"valueCC\"}", "origQueueO3"); - final List messageData = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageData = jmxArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(3)); - jmxArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList(messageData.get(1).getMsgId(), messageData.get(2).getMsgId()).iterator()); + jmxArtemisConnector.remove(queue, asList(messageData.get(0).getMsgId(), messageData.get(2).getMsgId()).iterator()); - final List messageDataAfterRemoval = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageDataAfterRemoval = jmxArtemisConnector.messagesOf(queue); assertThat(messageDataAfterRemoval, hasSize(1)); - assertThat(messageDataAfterRemoval.get(0).getMsgId(), is(messageData.get(0).getMsgId())); + assertThat(messageDataAfterRemoval.get(0).getMsgId(), is(messageData.get(1).getMsgId())); } @Test @@ -92,12 +108,12 @@ public void shouldIgnoreMessagesNotInTheQueue() throws Exception { putInQueue(queue, "{\"key1\":\"value123\"}", "origQueueO1"); putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); - final List messageData = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageData = jmxArtemisConnector.messagesOf(queue); assertThat(messageData, hasSize(2)); - jmxArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList("id_does_not_exist_123", messageData.get(1).getMsgId()).iterator()); + jmxArtemisConnector.remove(queue, asList("id_does_not_exist_123", messageData.get(1).getMsgId()).iterator()); - final List messageDataAfterRemoval = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageDataAfterRemoval = jmxArtemisConnector.messagesOf(queue); assertThat(messageDataAfterRemoval, hasSize(1)); assertThat(messageDataAfterRemoval.get(0).getMsgId(), is(messageData.get(0).getMsgId())); @@ -113,16 +129,16 @@ public void shouldReturnNumberOfDeletedMessages() throws Exception { putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); putInQueue(queue, "{\"key1\":\"valueCC\"}", "origQueueO3"); - final List messageData = jmxArtemisConnector.messagesOf("localhost", "3000", "0.0.0.0", queue); + final List messageData = jmxArtemisConnector.messagesOf(queue); - final long removedMessages = jmxArtemisConnector.remove("localhost", "3000", "0.0.0.0", queue, asList(messageData.get(1).getMsgId(), "unknown_id", messageData.get(2).getMsgId()).iterator()); + final long removedMessages = jmxArtemisConnector.remove(queue, asList(messageData.get(1).getMsgId(), "unknown_id", messageData.get(2).getMsgId()).iterator()); assertThat(removedMessages, is(2L)); } @Test public void shouldReturnListOfQueues() throws Exception { - final String[] queueNames = jmxArtemisConnector.queueNames("localhost", "3000", "0.0.0.0"); - assertThat(queueNames, arrayContainingInAnyOrder("DLQ", "ExpiryQueue")); + final List queueNames = jmxArtemisConnector.queueNames(); + assertThat(queueNames, contains("DLQ", "ExpiryQueue")); } @Test @@ -131,15 +147,15 @@ public void shouldReturnListOfTopics() throws Exception { cleanTopic(topic, "testSubscription"); - final String[] topicNames = jmxArtemisConnector.topicNames("localhost", "3000", "0.0.0.0"); + final List topicNames = jmxArtemisConnector.topicNames(); - assertThat(topicNames, arrayContainingInAnyOrder("testTopic")); + assertThat(topicNames, contains("testTopic")); } @Test public void shouldReturnQueuesAndCounts() throws Exception { final String queue = "DLQ"; - final String[] queues = {"DLQ", "ExpiryQueue"}; + final List queues = asList("DLQ", "ExpiryQueue"); try { cleanQueue(queue); @@ -148,7 +164,7 @@ public void shouldReturnQueuesAndCounts() throws Exception { putInQueue(queue, "{\"key1\":\"valueBB\"}", "origQueueO2"); putInQueue(queue, "{\"key1\":\"valueCC\"}", "origQueueO3"); - final Map results = jmxArtemisConnector.queueMessageCount("localhost", "3000", "0.0.0.0", queues); + final Map results = jmxArtemisConnector.queueMessageCount(queues); assertThat(results.containsKey("DLQ"), is(true)); assertThat(results.get("DLQ"),equalTo(3L)); @@ -161,7 +177,7 @@ public void shouldReturnQueuesAndCounts() throws Exception { @Test public void shouldReturnTopicsAndCounts() throws Exception { final String topic = "testTopic"; - final String[] topics = {topic}; + final List topics = asList(topic); try { cleanTopic(topic, "testSubscription"); @@ -169,9 +185,9 @@ public void shouldReturnTopicsAndCounts() throws Exception { putOnTopic(topic, "{\"key1\":\"value123\"}", "origQueueO1"); putOnTopic(topic, "{\"key1\":\"valueBB\"}", "origQueueO2"); putOnTopic(topic, "{\"key1\":\"valueCC\"}", "origQueueO3"); - - final Map results = jmxArtemisConnector.topicMessageCount("localhost", "3000", "0.0.0.0", topics); - + + final Map results = jmxArtemisConnector.topicMessageCount(topics); + assertThat(results.containsKey("testTopic"), is(true)); assertThat(results.get("testTopic"),equalTo(3L)); } catch ( final Exception e ) { @@ -179,4 +195,4 @@ public void shouldReturnTopicsAndCounts() throws Exception { throw e; } } -} +} \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagementFunctionFailedExceptionTest.java b/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagementFunctionFailedExceptionTest.java index 5085451..dfeb934 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagementFunctionFailedExceptionTest.java +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsManagementFunctionFailedExceptionTest.java @@ -1,6 +1,6 @@ package uk.gov.justice.artemis.manager.connector.jms; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; @@ -15,7 +15,7 @@ public void shouldConstructExceptionWithMessageAndCause() throws Exception { final JmsManagementFunctionFailedException exception = new JmsManagementFunctionFailedException(message, cause); - assertThat(exception.getMessage(), is(message)); - assertThat(exception.getCause(), is(cause)); + assertThat(exception.getMessage(), equalTo(message)); + assertThat(exception.getCause(), equalTo(cause)); } -} +} \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java b/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java index eda6f6f..2f6b022 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java +++ b/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java @@ -22,7 +22,7 @@ import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; public class JmsTestUtil { - private static final ConnectionFactory JMS_CF = new ActiveMQConnectionFactory("tcp://localhost:61616?clientID=1234"); + private static final ConnectionFactory JMS_CF = new ActiveMQConnectionFactory("tcp://localhost:61616?clientID=artemis-manager"); private static Connection JMS_CONNECTION; private static Session JMS_SESSION; private static Map QUEUES = new HashMap<>(); @@ -127,7 +127,7 @@ private static MessageProducer publisherOf(final String topicName) throws JMSExc } private static TopicSubscriber subscriberOf(final String topicName, final String subscriptionName) throws JMSException { - return SUBSCRIBERS.computeIfAbsent(topicName, name -> { + return SUBSCRIBERS.computeIfAbsent(topicName, name -> { try { return JMS_SESSION.createDurableSubscriber(topicOf(name), subscriptionName); } catch (JMSException e) { @@ -135,12 +135,41 @@ private static TopicSubscriber subscriberOf(final String topicName, final String } }); } - + public static void closeJmsConnection() throws JMSException { + SUBSCRIBERS.values().stream().forEach( + s -> { + try { + s.close(); + } catch (JMSException e) { + } + }); SUBSCRIBERS.clear(); + PUBLISHERS.values().stream().forEach( + p -> { + try { + p.close(); + } catch (JMSException e) { + } + }); PUBLISHERS.clear(); + CONSUMERS.values().stream().forEach( + c -> { + try { + c.close(); + } catch (JMSException e) { + } + }); CONSUMERS.clear(); + + PRODUCERS.values().stream().forEach( + p -> { + try { + p.close(); + } catch (JMSException e) { + } + }); PRODUCERS.clear(); TOPICS.clear(); diff --git a/src/test/java/uk/gov/justice/framework/tools/command/BrowseTest.java b/src/test/java/uk/gov/justice/framework/tools/command/BrowseTest.java index f4ba8f9..77fcdeb 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/BrowseTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/BrowseTest.java @@ -2,14 +2,16 @@ import static org.mockito.Mockito.verify; +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; + +import java.util.Arrays; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class BrowseTest { @@ -22,12 +24,11 @@ public class BrowseTest { @Test public void shouldInvokeConnector() throws Exception { + browseCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); + browseCommand.jmsURL = "tcp://localhost:61616"; browseCommand.brokerName = "brokerabc"; - browseCommand.host = "some.host"; - browseCommand.port = "1212"; browseCommand.run(null); - verify(artemisConnector).messagesOf("some.host", "1212", "brokerabc", "DLQ"); - + verify(artemisConnector).messagesOf("DLQ"); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/ListQueuesTest.java b/src/test/java/uk/gov/justice/framework/tools/command/ListQueuesTest.java index f81a4e1..baca287 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/ListQueuesTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/ListQueuesTest.java @@ -1,8 +1,11 @@ package uk.gov.justice.framework.tools.command; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; + +import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; @@ -10,8 +13,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class ListQueuesTest { @@ -24,12 +25,11 @@ public class ListQueuesTest { @Test public void shouldInvokeConnector() throws Exception { + listQueuesCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); listQueuesCommand.brokerName = "brokerabc"; - listQueuesCommand.host = "some.host"; - listQueuesCommand.port = "1212"; - when(artemisConnector.queueNames(anyString(), anyString(), anyString())).thenReturn(new String[] {"DLQ", "ExpiryQueue" }); + when(artemisConnector.queueNames()).thenReturn(Arrays.asList("DLQ", "ExpiryQueue")); listQueuesCommand.run(null); - verify(artemisConnector).queueNames("some.host", "1212", "brokerabc"); + verify(artemisConnector).queueNames(); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/ListTopicsTest.java b/src/test/java/uk/gov/justice/framework/tools/command/ListTopicsTest.java index a28a23a..a06d3d5 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/ListTopicsTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/ListTopicsTest.java @@ -1,8 +1,11 @@ package uk.gov.justice.framework.tools.command; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; + +import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; @@ -10,8 +13,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class ListTopicsTest { @@ -24,12 +25,11 @@ public class ListTopicsTest { @Test public void shouldInvokeConnector() throws Exception { + listTopicsCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); listTopicsCommand.brokerName = "brokerabc"; - listTopicsCommand.host = "some.host"; - listTopicsCommand.port = "1212"; - when(artemisConnector.topicNames(anyString(), anyString(), anyString())).thenReturn(new String[] {"testTopic" }); + when(artemisConnector.topicNames()).thenReturn(Arrays.asList("testTopic")); listTopicsCommand.run(null); - verify(artemisConnector).topicNames("some.host", "1212", "brokerabc"); + verify(artemisConnector).topicNames(); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/QueueMessageCountsTest.java b/src/test/java/uk/gov/justice/framework/tools/command/QueueMessageCountsTest.java index b029801..a25e977 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/QueueMessageCountsTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/QueueMessageCountsTest.java @@ -1,12 +1,15 @@ package uk.gov.justice.framework.tools.command; -import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.Test; @@ -15,8 +18,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class QueueMessageCountsTest { @@ -29,20 +30,19 @@ public class QueueMessageCountsTest { @Test public void shouldInvokeConnector() throws Exception { + queueMessageCounts.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); queueMessageCounts.brokerName = "brokerabc"; - queueMessageCounts.host = "some.host"; - queueMessageCounts.port = "1212"; - final String[] queues = {"queueA", "queueB" }; + final List queues = Arrays.asList("queueA", "queueB"); final Map messageCounts = Collections.unmodifiableMap(new HashMap() { { put("queueA", 100L); put("queueB", 101L); } }); - when(artemisConnector.queueNames(anyString(), anyString(), anyString())).thenReturn(queues); - when(artemisConnector.queueMessageCount(anyString(), anyString(), anyString(), eq(queues) )).thenReturn(messageCounts); + when(artemisConnector.queueNames()).thenReturn(queues); + when(artemisConnector.queueMessageCount(eq(queues))).thenReturn(messageCounts); queueMessageCounts.run(null); - verify(artemisConnector).queueMessageCount("some.host", "1212", "brokerabc", queues); + verify(artemisConnector).queueMessageCount(queues); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/RemoveTest.java b/src/test/java/uk/gov/justice/framework/tools/command/RemoveTest.java index a312152..4143960 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/RemoveTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/RemoveTest.java @@ -1,6 +1,6 @@ package uk.gov.justice.framework.tools.command; -import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; @@ -8,10 +8,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.PrintStream; +import java.util.Arrays; import java.util.Iterator; import org.junit.After; @@ -24,8 +27,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class RemoveTest { @@ -57,23 +58,20 @@ public void cleanUpStreams() { @Test public void shouldInvokeConnectorWithSingleMessageId() throws Exception { + removeCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); removeCommand.brokerName = "brokerabc"; - removeCommand.host = "some.host"; - removeCommand.port = "1212"; removeCommand.msgId = "123456"; removeCommand.run(null); - verify(artemisConnector).remove(eq("some.host"), eq("1212"), eq("brokerabc"), eq("DLQ"), msgIdsIteratorCaptor.capture()); - assertThat(msgIdsIteratorCaptor.getValue().next(), is("123456")); - + verify(artemisConnector).remove(eq("DLQ"), msgIdsIteratorCaptor.capture()); + assertThat(msgIdsIteratorCaptor.getValue().next(), equalTo("123456")); } @Test public void shouldInvokeConnectorWhenReceivingMultipleMessageIdsOnInput() throws Exception { + removeCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); removeCommand.brokerName = "brokerabc"; - removeCommand.host = "some.host"; - removeCommand.port = "1212"; final InputStream sysIn = System.in; final ByteArrayInputStream in = new ByteArrayInputStream("id1 id2 id3".getBytes()); @@ -81,18 +79,16 @@ public void shouldInvokeConnectorWhenReceivingMultipleMessageIdsOnInput() throws removeCommand.run(null); System.setIn(sysIn); - verify(artemisConnector).remove(eq("some.host"), eq("1212"), eq("brokerabc"), eq("DLQ"), msgIdsIteratorCaptor.capture()); + verify(artemisConnector).remove(eq("DLQ"), msgIdsIteratorCaptor.capture()); final Iterator msgIdsIteratorCaptor = this.msgIdsIteratorCaptor.getValue(); - assertThat(msgIdsIteratorCaptor.next(), is("id1")); - assertThat(msgIdsIteratorCaptor.next(), is("id2")); - assertThat(msgIdsIteratorCaptor.next(), is("id3")); - + assertThat(msgIdsIteratorCaptor.next(), equalTo("id1")); + assertThat(msgIdsIteratorCaptor.next(), equalTo("id2")); + assertThat(msgIdsIteratorCaptor.next(), equalTo("id3")); } @Test public void shouldOutputNumnerOfRemovedMessages() throws Exception { - - when(artemisConnector.remove(anyString(), anyString(), anyString(), anyString(), any(Iterator.class))).thenReturn(3l); + when(artemisConnector.remove(anyString(), any(Iterator.class))).thenReturn(3l); final InputStream sysIn = System.in; final ByteArrayInputStream in = new ByteArrayInputStream(NOT_USED_BYTES); @@ -101,9 +97,6 @@ public void shouldOutputNumnerOfRemovedMessages() throws Exception { removeCommand.run(null); System.setIn(sysIn); - assertThat(outContent.toString(), is("{\"Command\":\"Remove message\",\"Occurrences\":3}\n")); - + assertThat(outContent.toString(), equalTo("{\"Command\":\"Remove message\",\"Occurrences\":3}\n")); } - - } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/ReprocessTest.java b/src/test/java/uk/gov/justice/framework/tools/command/ReprocessTest.java index cdd52e9..73d0840 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/ReprocessTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/ReprocessTest.java @@ -14,6 +14,7 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.PrintStream; +import java.util.Arrays; import java.util.Iterator; import org.junit.After; @@ -58,22 +59,20 @@ public void cleanUpStreams() { @Test public void shouldInvokeConnectorWithSingleMessageId() throws Exception { + reprocessCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); reprocessCommand.brokerName = "brokerabc"; - reprocessCommand.host = "some.host"; - reprocessCommand.port = "1212"; reprocessCommand.msgId = "123456"; reprocessCommand.run(null); - verify(artemisConnector).reprocess(eq("some.host"), eq("1212"), eq("brokerabc"), eq("DLQ"), msgIdsIteratorCaptor.capture()); + verify(artemisConnector).reprocess(eq("DLQ"), msgIdsIteratorCaptor.capture()); assertThat(msgIdsIteratorCaptor.getValue().next(), is("123456")); } @Test public void shouldInvokeConnectorWhenReceivingMultipleMessageIdsOnInput() throws Exception { + reprocessCommand.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); reprocessCommand.brokerName = "brokerabc"; - reprocessCommand.host = "some.host"; - reprocessCommand.port = "1212"; final InputStream sysIn = System.in; final ByteArrayInputStream in = new ByteArrayInputStream("id1 id2 id3".getBytes()); @@ -82,7 +81,7 @@ public void shouldInvokeConnectorWhenReceivingMultipleMessageIdsOnInput() throws reprocessCommand.run(null); System.setIn(sysIn); - verify(artemisConnector).reprocess(eq("some.host"), eq("1212"), eq("brokerabc"), eq("DLQ"), msgIdsIteratorCaptor.capture()); + verify(artemisConnector).reprocess(eq("DLQ"), msgIdsIteratorCaptor.capture()); final Iterator msgIdsIteratorCaptor = this.msgIdsIteratorCaptor.getValue(); assertThat(msgIdsIteratorCaptor.next(), is("id1")); assertThat(msgIdsIteratorCaptor.next(), is("id2")); @@ -92,7 +91,7 @@ public void shouldInvokeConnectorWhenReceivingMultipleMessageIdsOnInput() throws @Test public void shouldOutputNumnerOfReprocessedMessages() throws Exception { - when(artemisConnector.reprocess(anyString(), anyString(), anyString(), anyString(), any(Iterator.class))).thenReturn(3l); + when(artemisConnector.reprocess(anyString(), any(Iterator.class))).thenReturn(3l); final InputStream sysIn = System.in; final ByteArrayInputStream in = new ByteArrayInputStream(NOT_USED_BYTES); @@ -103,6 +102,4 @@ public void shouldOutputNumnerOfReprocessedMessages() throws Exception { assertThat(outContent.toString(), is("{\"Command\":\"Reprocess message\",\"Occurrences\":3}\n")); } - - } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/framework/tools/command/TopicMessageCountsTest.java b/src/test/java/uk/gov/justice/framework/tools/command/TopicMessageCountsTest.java index e5bdab7..21f6335 100644 --- a/src/test/java/uk/gov/justice/framework/tools/command/TopicMessageCountsTest.java +++ b/src/test/java/uk/gov/justice/framework/tools/command/TopicMessageCountsTest.java @@ -1,12 +1,15 @@ package uk.gov.justice.framework.tools.command; -import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import uk.gov.justice.artemis.manager.connector.ArtemisConnector; + +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.Test; @@ -15,8 +18,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import uk.gov.justice.artemis.manager.connector.ArtemisConnector; - @RunWith(MockitoJUnitRunner.class) public class TopicMessageCountsTest { @@ -29,20 +30,19 @@ public class TopicMessageCountsTest { @Test public void shouldInvokeConnector() throws Exception { + topicMessageCounts.jmxURLs = Arrays.asList("service:jmx:rmi:///jndi/rmi://localhost:3000/jmxrmi"); topicMessageCounts.brokerName = "brokerabc"; - topicMessageCounts.host = "some.host"; - topicMessageCounts.port = "1212"; - final String[] topics = {"topicA", "topicB" }; + final List topics = Arrays.asList("topicA", "topicB"); final Map messageCounts = Collections.unmodifiableMap(new HashMap() { { put("topicA", 100L); put("topicB", 101L); } }); - when(artemisConnector.topicNames(anyString(), anyString(), anyString())).thenReturn(topics); - when(artemisConnector.topicMessageCount(anyString(), anyString(), anyString(), eq(topics) )).thenReturn(messageCounts); + when(artemisConnector.topicNames()).thenReturn(topics); + when(artemisConnector.topicMessageCount(eq(topics))).thenReturn(messageCounts); topicMessageCounts.run(null); - Map results = verify(artemisConnector).topicMessageCount("some.host", "1212", "brokerabc", topics); + Map results = verify(artemisConnector).topicMessageCount(topics); } } \ No newline at end of file From 771eac124dcee0b8109b580db5ab8eb29210481b Mon Sep 17 00:00:00 2001 From: David Edwards Date: Wed, 5 Sep 2018 15:21:47 +0100 Subject: [PATCH 2/3] Resolve Sonar violations and increase test coverage --- .../manager/connector/ArtemisConnector.java | 14 +++--- .../CombinedJmsAndJmxArtemisConnector.java | 43 ++++++++--------- .../connector/JmxArtemisConnector.java | 47 +++++++++---------- .../manager/connector/jms/JmsProcessor.java | 4 +- .../jms/JmsProcessorFailureException.java | 8 ++++ .../manager/connector/jmx/JmxProcessor.java | 20 ++++---- .../jmx/JmxProcessorFailureException.java | 8 ++++ .../tools/command/AbstractArtemisCommand.java | 13 ++--- .../connector/jms/JmsProcessorTest.java | 33 +++++++++++++ 9 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorFailureException.java create mode 100644 src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessorFailureException.java create mode 100644 src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorTest.java diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java index 74d6db9..2ddc10e 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/ArtemisConnector.java @@ -8,19 +8,19 @@ public interface ArtemisConnector { - List messagesOf(final String destinationName) throws Exception; + List messagesOf(final String destinationName); - long remove(final String destinationName, final Iterator msgIds) throws Exception; + long remove(final String destinationName, final Iterator msgIds); - long reprocess(final String destinationName, final Iterator msgIds) throws Exception; + long reprocess(final String destinationName, final Iterator msgIds); - List queueNames() throws Exception; + List queueNames(); - List topicNames() throws Exception; + List topicNames(); - Map queueMessageCount(final Collection queueNames) throws Exception; + Map queueMessageCount(final Collection queueNames); - Map topicMessageCount(final Collection queueNames) throws Exception; + Map topicMessageCount(final Collection queueNames); void setParameters(final List jmxUrls, final String brokerName, diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java index d0ac0e0..4bc077a 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnector.java @@ -12,7 +12,6 @@ import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; import uk.gov.justice.output.ConsolePrinter; -import java.net.MalformedURLException; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -53,12 +52,12 @@ public void setParameters(final List jmxUrls, final String jmxPassword, final String jmsUrl, final String jmsUsername, - final String jmsPassword) throws MalformedURLException { + final String jmsPassword) { this.jmxServiceUrls = jmxProcessor.processJmxUrls(jmxUrls); this.objectNameBuilder = jmxProcessor.getObjectNameBuilder(brokerName); if ((jmxUsername != null) && (jmxPassword != null)) { - this.jmxEnvironment = new HashMap(); + this.jmxEnvironment = new HashMap<>(); this.jmxEnvironment.put(JMXConnector.CREDENTIALS, new String[]{ jmxUsername, jmxPassword }); } else { this.jmxEnvironment = emptyMap(); @@ -72,45 +71,43 @@ public void setParameters(final List jmxUrls, } @Override - public List messagesOf(final String destinationName) throws Exception { + public List messagesOf(final String destinationName) { return jmsProcessor.process(this.jmsFactory, destinationName, jmsManagement.browseMessages()); } @Override - public long remove(final String destinationName, final Iterator msgIds) throws Exception { + public long remove(final String destinationName, final Iterator msgIds) { return jmxProcessor.processQueueControl(this.jmxServiceUrls, - this.jmxEnvironment, - this.objectNameBuilder, - destinationName, - jmxManagement.removeMessages(msgIds)).collect( - summingLong(Long::longValue)); + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.removeMessages(msgIds)).mapToLong(Long::longValue).sum(); } @Override - public long reprocess(final String destinationName, final Iterator msgIds) throws Exception { + public long reprocess(final String destinationName, final Iterator msgIds) { return jmxProcessor.processQueueControl( - this.jmxServiceUrls, - this.jmxEnvironment, - this.objectNameBuilder, - destinationName, - jmxManagement.reprocessMessages(msgIds)).collect( - summingLong(Long::longValue)); + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.reprocessMessages(msgIds)).mapToLong(Long::longValue).sum(); } @Override - public List queueNames() throws Exception { + public List queueNames() { return jmxProcessor.processServerControl( this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, JMSServerControl::getQueueNames).flatMap( - l -> Arrays.stream(l)).sorted(). + Arrays::stream).sorted(). distinct().collect(toList()); } @Override - public Map queueMessageCount(final Collection queueNames) throws Exception { + public Map queueMessageCount(final Collection queueNames) { return jmxProcessor.processQueues(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, @@ -122,17 +119,17 @@ public Map queueMessageCount(final Collection queueNames) } @Override - public List topicNames() throws Exception { + public List topicNames() { return jmxProcessor.processServerControl(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, JMSServerControl::getTopicNames).flatMap( - l -> Arrays.stream(l)).sorted(). + Arrays::stream).sorted(). distinct().collect(toList()); } @Override - public Map topicMessageCount(final Collection topicNames) throws Exception { + public Map topicMessageCount(final Collection topicNames) { return jmxProcessor.processTopics(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java b/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java index 9d26fb8..fa5bba2 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnector.java @@ -10,7 +10,6 @@ import uk.gov.justice.artemis.manager.connector.jmx.JmxProcessor; import uk.gov.justice.output.ConsolePrinter; -import java.net.MalformedURLException; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -32,7 +31,7 @@ public class JmxArtemisConnector implements ArtemisConnector { private final JmxManagement jmxManagement = new JmxManagement(new ConsolePrinter()); private List jmxServiceUrls; - private Map jmxEnvironment; + private Map jmxEnvironment = new HashMap<>(); private ObjectNameBuilder objectNameBuilder; @Override @@ -42,12 +41,12 @@ public void setParameters(final List jmxUrls, final String jmxPassword, final String jmsUrl, final String jmsUsername, - final String jmsPassword) throws MalformedURLException { + final String jmsPassword) { this.jmxServiceUrls = jmxProcessor.processJmxUrls(jmxUrls); this.objectNameBuilder = jmxProcessor.getObjectNameBuilder(brokerName); if ((jmxUsername != null) && (jmxPassword != null)) { - this.jmxEnvironment = new HashMap(); + this.jmxEnvironment = new HashMap<>(); this.jmxEnvironment.put(JMXConnector.CREDENTIALS, new String[]{ jmxUsername, jmxPassword }); } else { this.jmxEnvironment = emptyMap(); @@ -55,50 +54,48 @@ public void setParameters(final List jmxUrls, } @Override - public List messagesOf(final String destinationName) throws Exception { + public List messagesOf(final String destinationName) { return jmxProcessor.processQueueControl(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, destinationName, jmxManagement.browseMessages()).flatMap( - l -> l.stream()).collect(toList()); + Collection::stream).collect(toList()); } @Override - public long remove(final String destinationName, final Iterator msgIds) throws Exception { + public long remove(final String destinationName, final Iterator msgIds) { return jmxProcessor.processQueueControl(this.jmxServiceUrls, - this.jmxEnvironment, - this.objectNameBuilder, - destinationName, - jmxManagement.removeMessages(msgIds)).collect( - summingLong(Long::longValue)); + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.removeMessages(msgIds)).mapToLong(Long::longValue).sum(); } @Override - public long reprocess(final String destinationName, final Iterator msgIds) throws Exception { + public long reprocess(final String destinationName, final Iterator msgIds) { return jmxProcessor.processQueueControl( - this.jmxServiceUrls, - this.jmxEnvironment, - this.objectNameBuilder, - destinationName, - jmxManagement.reprocessMessages(msgIds)).collect( - summingLong(Long::longValue)); + this.jmxServiceUrls, + this.jmxEnvironment, + this.objectNameBuilder, + destinationName, + jmxManagement.reprocessMessages(msgIds)).mapToLong(Long::longValue).sum(); } @Override - public List queueNames() throws Exception { + public List queueNames() { return jmxProcessor.processServerControl( this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, JMSServerControl::getQueueNames).flatMap( - l -> Arrays.stream(l)).sorted(). + Arrays::stream).sorted(). distinct().collect(toList()); } @Override - public Map queueMessageCount(final Collection queueNames) throws Exception { + public Map queueMessageCount(final Collection queueNames) { return jmxProcessor.processQueues(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, @@ -110,17 +107,17 @@ public Map queueMessageCount(final Collection queueNames) } @Override - public List topicNames() throws Exception { + public List topicNames() { return jmxProcessor.processServerControl(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, JMSServerControl::getTopicNames).flatMap( - l -> Arrays.stream(l)).sorted(). + Arrays::stream).sorted(). distinct().collect(toList()); } @Override - public Map topicMessageCount(final Collection topicNames) throws Exception { + public Map topicMessageCount(final Collection topicNames) { return jmxProcessor.processTopics(this.jmxServiceUrls, this.jmxEnvironment, this.objectNameBuilder, diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java index f5acb5f..55a15d8 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessor.java @@ -14,7 +14,7 @@ public class JmsProcessor { public T process(ActiveMQJMSConnectionFactory factory, final String destinationName, - final JmsManagementFunction jmsManagementFunction) throws JMSException { + final JmsManagementFunction jmsManagementFunction) { final Queue queue = ActiveMQJMSClient.createQueue(destinationName); @@ -23,6 +23,8 @@ public T process(ActiveMQJMSConnectionFactory factory, final QueueBrowser queueBrowser = queueSession.createBrowser(queue)) { return jmsManagementFunction.apply(queueBrowser); + } catch (JMSException e) { + throw new JmsProcessorFailureException("Error connecting to queue to apply JMS management function", e); } } } \ No newline at end of file diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorFailureException.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorFailureException.java new file mode 100644 index 0000000..9be76c4 --- /dev/null +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorFailureException.java @@ -0,0 +1,8 @@ +package uk.gov.justice.artemis.manager.connector.jms; + +public class JmsProcessorFailureException extends RuntimeException { + + public JmsProcessorFailureException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java index fb9a8a8..1c82270 100644 --- a/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessor.java @@ -48,13 +48,13 @@ public Stream processQueueControl( final Map env, final ObjectNameBuilder onb, final String destinationName, - final JmxManagementFunction jmxManagementFunction) throws Exception { + final JmxManagementFunction jmxManagementFunction) { return serviceUrls.stream().map(s -> { try (final JMXConnector connector = getJMXConnector(s, env)) { return processQueueControl(connector, onb, destinationName, jmxManagementFunction); } catch (Exception e) { - throw new RuntimeException(e); + throw new JmxProcessorFailureException("Error while processing queue control", e); }}); } @@ -69,20 +69,20 @@ public T processServerControl(final JMXConnector connector, public Stream processServerControl(final List serviceUrls, final Map env, final ObjectNameBuilder onb, - final Function fn) throws Exception { + final Function fn) { return serviceUrls.stream().map(s -> { try (final JMXConnector connector = getJMXConnector(s, env)) { return processServerControl(connector, onb, fn); } catch (Exception e) { - throw new RuntimeException(e); + throw new JmxProcessorFailureException("Error while processing server control", e); }}); } public Map processQueues(final JMXConnector connector, final ObjectNameBuilder onb, final Collection destinations, - final Function fn) throws Exception { + final Function fn) { return destinations.stream().collect(toMap(Function.identity(), destination -> { try { return processQueueControl(connector, onb, destination, fn); @@ -96,19 +96,19 @@ public Stream> processQueues(final List servic final Map env, final ObjectNameBuilder onb, final Collection destinations, - final Function fn) throws Exception { + final Function fn) { return serviceUrls.stream().map(s -> { try (final JMXConnector connector = getJMXConnector(s, env)) { return processQueues(connector, onb, destinations, fn); } catch (Exception e) { - throw new RuntimeException(e); + throw new JmxProcessorFailureException("Error while processing queues", e); }}); } public Map processTopics(JMXConnector connector, final ObjectNameBuilder onb, final Collection destinations, - final Function fn) throws Exception { + final Function fn) { return destinations.stream().collect(toMap(Function.identity(), destination -> { try { return processTopicControl(connector, onb, destination, fn); @@ -122,12 +122,12 @@ public Stream> processTopics(final List servic final Map env, final ObjectNameBuilder onb, final Collection destinations, - final Function fn) throws Exception { + final Function fn) { return serviceUrls.stream().map(s -> { try (final JMXConnector connector = getJMXConnector(s, env)) { return processTopics(connector, onb, destinations, fn); } catch (Exception e) { - throw new RuntimeException(e); + throw new JmxProcessorFailureException("Error while processing topics", e); }}); } diff --git a/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessorFailureException.java b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessorFailureException.java new file mode 100644 index 0000000..7e289c3 --- /dev/null +++ b/src/main/java/uk/gov/justice/artemis/manager/connector/jmx/JmxProcessorFailureException.java @@ -0,0 +1,8 @@ +package uk.gov.justice.artemis.manager.connector.jmx; + +public class JmxProcessorFailureException extends RuntimeException { + + public JmxProcessorFailureException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java b/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java index ab6ae4e..fdbbf58 100644 --- a/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java +++ b/src/main/java/uk/gov/justice/framework/tools/command/AbstractArtemisCommand.java @@ -5,22 +5,23 @@ import uk.gov.justice.output.ConsolePrinter; import uk.gov.justice.output.OutputPrinter; -import java.util.Arrays; +import java.net.MalformedURLException; import java.util.List; import com.beust.jcommander.Parameter; +import com.google.common.collect.ImmutableList; abstract class AbstractArtemisCommand { - static public final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"; - static public final String DEFAULT_BROKER_NAME = "default"; - static public final String DEFAULT_JMS_URL = "tcp://localhost:61616?clientID=artemis-manager"; + public static final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"; + public static final String DEFAULT_BROKER_NAME = "default"; + public static final String DEFAULT_JMS_URL = "tcp://localhost:61616?clientID=artemis-manager"; final OutputPrinter outputPrinter = new ConsolePrinter(); ArtemisConnector artemisConnector = new CombinedJmsAndJmxArtemisConnector(); @Parameter(names = "-jmxUrl", description = "Full JMX URLs, can be specified mulitple times (default: " + DEFAULT_JMX_URL + ")", variableArity = true) - List jmxURLs = Arrays.asList(DEFAULT_JMX_URL); + List jmxURLs = ImmutableList.of(DEFAULT_JMX_URL); @Parameter(names = {"-brokerName", "-jmxBrokerName"}, description = "broker name as specified in broker.xml (default: " + DEFAULT_BROKER_NAME + ")") String brokerName = DEFAULT_BROKER_NAME; @@ -43,7 +44,7 @@ abstract class AbstractArtemisCommand { @Parameter(names = "-help", help = true) private boolean help; - public void setup() throws Exception { + public void setup() throws MalformedURLException { artemisConnector.setParameters(this.jmxURLs, this.brokerName, this.jmxUsername, diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorTest.java b/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorTest.java new file mode 100644 index 0000000..37431fe --- /dev/null +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/jms/JmsProcessorTest.java @@ -0,0 +1,33 @@ +package uk.gov.justice.artemis.manager.connector.jms; + +import static org.mockito.Mockito.when; + +import javax.jms.JMSException; + +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class JmsProcessorTest { + + @Mock + private ActiveMQJMSConnectionFactory factory; + + @Mock + private JmsManagementFunction function; + + @InjectMocks + private JmsProcessor jmsProcessor; + + @Test(expected = JmsProcessorFailureException.class) + public void shouldThrowRuntimeException() throws Exception { + + when(factory.createQueueConnection()).thenThrow(new JMSException("mock failure")); + + jmsProcessor.process(factory, "DummyDestination", function); + } +} \ No newline at end of file From fc3f3b4f4e1a56674a017a8eb8463c96d52b2106 Mon Sep 17 00:00:00 2001 From: David Edwards Date: Thu, 6 Sep 2018 15:52:50 +0100 Subject: [PATCH 3/3] Add integration test for message counts --- .../artemis/manager/ArtemisManagerIT.java | 1 + .../CombinedJmsAndJmxArtemisConnectorIT.java | 47 +++++++++++++++++-- .../connector/JmxArtemisConnectorIT.java | 6 +-- .../artemis/manager/util/JmsTestUtil.java | 19 ++++++++ 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java b/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java index c774391..de5e881 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/ArtemisManagerIT.java @@ -16,6 +16,7 @@ import java.util.List; import javax.jms.JMSException; +import javax.jms.MessageConsumer; import org.apache.commons.io.IOUtils; import org.junit.AfterClass; diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java b/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java index 5658358..4bf5c05 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/CombinedJmsAndJmxArtemisConnectorIT.java @@ -1,26 +1,30 @@ package uk.gov.justice.artemis.manager.connector; import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.cleanQueue; +import static uk.gov.justice.artemis.manager.util.JmsTestUtil.cleanQueueWithNewConsumer; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.cleanTopic; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.closeJmsConnection; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.openJmsConnection; import static uk.gov.justice.artemis.manager.util.JmsTestUtil.putInQueue; +import static uk.gov.justice.artemis.manager.util.JmsTestUtil.putOnTopic; import java.io.ByteArrayInputStream; import java.net.MalformedURLException; -import java.util.Arrays; import java.util.List; +import java.util.Map; import javax.jms.JMSException; +import com.google.common.collect.ImmutableList; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -44,7 +48,7 @@ public static void afterClass() throws JMSException { public void setUp() throws MalformedURLException { this.combinedArtemisConnector = new CombinedJmsAndJmxArtemisConnector(); this.combinedArtemisConnector.setParameters( - Arrays.asList("service:jmx:rmi://localhost:3000/jndi/rmi://localhost:3000/jmxrmi"), + ImmutableList.of("service:jmx:rmi://localhost:3000/jndi/rmi://localhost:3000/jmxrmi"), "0.0.0.0", null, null, @@ -170,7 +174,7 @@ public void shouldReprocessMessageOntoOriginalQueue() throws Exception { @Test public void shouldReturnListOfQueues() throws Exception { final List queueNames = combinedArtemisConnector.queueNames(); - assertThat(queueNames, contains("DLQ", "ExpiryQueue")); + assertThat(queueNames, hasItems("DLQ", "ExpiryQueue")); } @Test @@ -182,6 +186,39 @@ public void shouldReturnListOfTopics() throws Exception { final List topicNames = combinedArtemisConnector.topicNames(); - assertThat(topicNames, contains("testTopic")); + assertThat(topicNames, hasItems("testTopic")); + } + + @Test + public void shouldReturnMessagesQueueCount() throws Exception { + + cleanQueueWithNewConsumer("origQueueO1"); + cleanQueueWithNewConsumer("origQueueO2"); + + putInQueue("origQueueO1", "{\"key1\":\"value123\"}"); + putInQueue("origQueueO2", "{\"key1\":\"valueBB\"}"); + + final Map messageCounts = combinedArtemisConnector.queueMessageCount(asList("origQueueO1", "origQueueO2")); + assertThat(messageCounts.keySet(), hasSize(2)); + assertThat(messageCounts.get("origQueueO1"), equalTo(1L)); + assertThat(messageCounts.get("origQueueO2"), equalTo(1L)); + } + + @Test + public void shouldReturnMessagesTopicCount() throws Exception { + final String topic1 = "topic1"; + final String topic2 = "topic2"; + + cleanTopic(topic1, "testSubscriptionA"); + cleanTopic(topic2, "testSubscriptionB"); + + + putOnTopic(topic1, "{\"key1\":\"value123\"}"); + putOnTopic(topic2, "{\"key1\":\"valueBB\"}"); + + final Map messageCounts = combinedArtemisConnector.topicMessageCount(asList(topic1, topic2)); + assertThat(messageCounts.keySet(), hasSize(2)); + assertThat(messageCounts.get(topic1), equalTo(1L)); + assertThat(messageCounts.get(topic2), equalTo(1L)); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java b/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java index 017bf09..3d6debc 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java +++ b/src/test/java/uk/gov/justice/artemis/manager/connector/JmxArtemisConnectorIT.java @@ -1,8 +1,8 @@ package uk.gov.justice.artemis.manager.connector; import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; @@ -138,7 +138,7 @@ public void shouldReturnNumberOfDeletedMessages() throws Exception { @Test public void shouldReturnListOfQueues() throws Exception { final List queueNames = jmxArtemisConnector.queueNames(); - assertThat(queueNames, contains("DLQ", "ExpiryQueue")); + assertThat(queueNames, hasItems("DLQ", "ExpiryQueue")); } @Test @@ -149,7 +149,7 @@ public void shouldReturnListOfTopics() throws Exception { final List topicNames = jmxArtemisConnector.topicNames(); - assertThat(topicNames, contains("testTopic")); + assertThat(topicNames, hasItems("testTopic")); } @Test diff --git a/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java b/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java index 2f6b022..2b2d954 100644 --- a/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java +++ b/src/test/java/uk/gov/justice/artemis/manager/util/JmsTestUtil.java @@ -78,6 +78,25 @@ public static int cleanQueue(final String queueName) throws JMSException { return cleanedMessage; } + /** + * Returns the number of messages that were removed from the queue, using a new consumer. + * + * @param queueName - the name of the queue that is to be cleaned + * @return the number of cleaned messages + */ + public static int cleanQueueWithNewConsumer(final String queueName) throws JMSException { + JMS_CONNECTION.start(); + int cleanedMessage = 0; + try(final MessageConsumer consumer = JMS_SESSION.createConsumer(queueOf(queueName))) { + + while (consumer.receiveNoWait() != null) { + cleanedMessage++; + } + } + JMS_CONNECTION.stop(); + return cleanedMessage; + } + /** * Returns the number of messages that were received from the topic. *