ARTEMIS-303 listing subs fails for JMS2 shared sub

This commit is contained in:
jbertram 2015-12-08 13:09:26 -06:00
parent 8abf9cfaa6
commit 831eabfc73
2 changed files with 45 additions and 1 deletions

View File

@ -199,7 +199,12 @@ public class ActiveMQDestination implements Destination, Serializable, Reference
} }
if (currentPart != 1) { if (currentPart != 1) {
throw new JMSRuntimeException("Invalid message queue name: " + queueName); /* JMS 2.0 introduced the ability to create "shared" subscriptions which do not require a clientID.
* In this case the subscription name will be the same as the queue name, but the above algorithm will put that
* in the wrong position in the array so we need to move it.
*/
parts[1] = parts[0];
parts[0] = new StringBuffer();
} }
Pair<String, String> pair = new Pair<>(parts[0].toString(), parts[1].toString()); Pair<String, String> pair = new Pair<>(parts[0].toString(), parts[1].toString());

View File

@ -16,6 +16,7 @@
*/ */
package org.apache.activemq.artemis.tests.integration.jms.server.management; package org.apache.activemq.artemis.tests.integration.jms.server.management;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.api.jms.management.JMSServerControl; import org.apache.activemq.artemis.api.jms.management.JMSServerControl;
@ -42,6 +43,8 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import javax.jms.Connection; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.Message; import javax.jms.Message;
import javax.jms.MessageConsumer; import javax.jms.MessageConsumer;
import javax.jms.MessageProducer; import javax.jms.MessageProducer;
@ -203,6 +206,42 @@ public class TopicControlTest extends ManagementTestBase {
connection_3.close(); connection_3.close();
} }
@Test
public void testListXXXSubscriptionsAsJSONJMS2() throws Exception {
ConnectionFactory cf = JMSUtil.createFactory(InVMConnectorFactory.class.getName(), ActiveMQClient.DEFAULT_CONNECTION_TTL_INVM, ActiveMQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD_INVM);
JMSContext jmsContext1 = cf.createContext();
jmsContext1.createSharedDurableConsumer(topic, subscriptionName, null);
JMSContext jmsContext2 = cf.createContext();
jmsContext2.createSharedDurableConsumer(topic, subscriptionName + "2", null);
JMSContext jmsContext3 = cf.createContext();
jmsContext3.createConsumer(topic);
TopicControl topicControl = createManagementControl();
String jsonString = topicControl.listDurableSubscriptionsAsJSON();
SubscriptionInfo[] infos = SubscriptionInfo.from(jsonString);
Assert.assertEquals(2, infos.length);
Assert.assertTrue(infos[0].getClientID().length() == 0);
Assert.assertTrue(infos[0].getName().equals(subscriptionName));
Assert.assertTrue(infos[1].getClientID().length() == 0);
Assert.assertTrue(infos[1].getName().equals(subscriptionName + "2"));
jsonString = topicControl.listNonDurableSubscriptionsAsJSON();
infos = SubscriptionInfo.from(jsonString);
Assert.assertEquals(1, infos.length);
Assert.assertEquals(null, infos[0].getClientID());
Assert.assertEquals(null, infos[0].getName());
jsonString = topicControl.listAllSubscriptionsAsJSON();
infos = SubscriptionInfo.from(jsonString);
Assert.assertEquals(3, infos.length);
jmsContext1.close();
jmsContext2.close();
jmsContext3.close();
}
@Test @Test
public void testListSubscriptionsAsJSONWithHierarchicalTopics() throws Exception { public void testListSubscriptionsAsJSONWithHierarchicalTopics() throws Exception {
serverManager.createTopic(false, "my.jms.#", "jms/all"); serverManager.createTopic(false, "my.jms.#", "jms/all");