/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.artemis.tests.integration.jms.jms2client; import javax.jms.JMSConsumer; import javax.jms.JMSContext; import javax.jms.JMSProducer; import javax.jms.JMSRuntimeException; import javax.jms.Topic; import java.util.Random; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.core.postoffice.Binding; import org.apache.activemq.artemis.tests.util.JMSTestBase; import org.junit.Before; import org.junit.Test; public class SharedConsumerTest extends JMSTestBase { private JMSContext context; private final Random random = new Random(); private Topic topic1; private Topic topic2; @Override @Before public void setUp() throws Exception { super.setUp(); context = createContext(); topic1 = createTopic(JmsContextTest.class.getSimpleName() + "Topic1"); topic2 = createTopic(JmsContextTest.class.getSimpleName() + "Topic2"); } @Test public void sharedDurableSubSimpleRoundRobin() throws Exception { context = cf.createContext(); try { JMSConsumer con1 = context.createSharedDurableConsumer(topic1, "mySharedCon"); JMSConsumer con2 = context.createSharedDurableConsumer(topic1, "mySharedCon"); context.start(); JMSProducer producer = context.createProducer(); int numMessages = 10; for (int i = 0; i < numMessages; i++) { producer.send(topic1, "msg:" + i); } for (int i = 0; i < numMessages; i += 2) { String msg = con1.receiveBody(String.class, 5000); System.out.println("msg = " + msg); msg = con2.receiveBody(String.class, 5000); System.out.println("msg = " + msg); } } finally { context.close(); } } @Test public void sharedDurableUnsubscribeNewTopic() throws Exception { context = cf.createContext(); try { JMSConsumer con1 = context.createSharedDurableConsumer(topic1, "mySharedCon"); JMSConsumer con2 = context.createSharedDurableConsumer(topic1, "mySharedCon"); con1.close(); con2.close(); context.unsubscribe("mySharedCon"); con1 = context.createSharedDurableConsumer(topic2, "mySharedCon"); } finally { context.close(); } } @Test public void sharedNonDurableUnsubscribeDifferentTopic() throws Exception { context = cf.createContext(); try { JMSConsumer con1 = context.createSharedConsumer(topic1, "mySharedCon"); JMSConsumer con2 = context.createSharedConsumer(topic1, "mySharedCon"); con1.close(); Binding binding = server.getPostOffice().getBinding(new SimpleString("nonDurable.mySharedCon")); assertNotNull(binding); con2.close(); binding = server.getPostOffice().getBinding(new SimpleString("nonDurable.mySharedCon")); assertNull(binding); con1 = context.createSharedConsumer(topic2, "mySharedCon"); } finally { context.close(); } } @Test public void sharedNonDurableSubOnDifferentSelector() throws Exception { context = cf.createContext(); try { context.createSharedConsumer(topic1, "mySharedCon", "sel = 'sel1'"); try { context.createSharedConsumer(topic1, "mySharedCon", "sel = 'sel2'"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedNonDurableSubOnDifferentSelectorSrcFilterNull() throws Exception { context = cf.createContext(); try { context.createSharedConsumer(topic1, "mySharedCon"); try { context.createSharedConsumer(topic1, "mySharedCon", "sel = 'sel2'"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedNonDurableSubOnDifferentSelectorTargetFilterNull() throws Exception { context = cf.createContext(); try { context.createSharedConsumer(topic1, "mySharedCon", "sel = 'sel1'"); try { context.createSharedConsumer(topic1, "mySharedCon"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedDurableSubOnDifferentTopic() throws Exception { context = cf.createContext(); try { context.createSharedDurableConsumer(topic1, "mySharedCon"); try { context.createSharedDurableConsumer(topic2, "mySharedCon"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedDurableSubOnDifferentSelector() throws Exception { context = cf.createContext(); try { context.createSharedDurableConsumer(topic1, "mySharedCon", "sel = 'sel1'"); try { context.createSharedDurableConsumer(topic1, "mySharedCon", "sel = 'sel2'"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedDurableSubOnDifferentSelectorSrcFilterNull() throws Exception { context = cf.createContext(); try { context.createSharedDurableConsumer(topic1, "mySharedCon"); try { context.createSharedDurableConsumer(topic1, "mySharedCon", "sel = 'sel2'"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } @Test public void sharedDurableSubOnDifferentSelectorTargetFilterNull() throws Exception { context = cf.createContext(); try { context.createSharedDurableConsumer(topic1, "mySharedCon", "sel = 'sel1'"); try { context.createSharedDurableConsumer(topic1, "mySharedCon"); fail("expected JMSRuntimeException"); } catch (JMSRuntimeException jmse) { //pass } catch (Exception e) { fail("threw wrong exception expected JMSRuntimeException got " + e); } } finally { context.close(); } } }