/* * 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; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.JMSConsumer; import javax.jms.JMSContext; import javax.jms.JMSProducer; import javax.jms.MessageFormatRuntimeException; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import java.util.ArrayList; import java.util.Random; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.core.client.impl.ClientSessionImpl; import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.core.settings.impl.AddressSettings; import org.apache.activemq.artemis.jms.client.ActiveMQJMSContext; import org.apache.activemq.artemis.jms.client.ActiveMQSession; import org.apache.activemq.artemis.jms.server.config.ConnectionFactoryConfiguration; import org.apache.activemq.artemis.tests.util.JMSTestBase; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class JmsProducerTest extends JMSTestBase { private JMSProducer producer; private Random random; private JMSContext context; @Override @Before public void setUp() throws Exception { super.setUp(); context = createContext(); producer = context.createProducer(); random = new Random(); } @Override protected void testCaseCfExtraConfig(ConnectionFactoryConfiguration configuration) { configuration.setConfirmationWindowSize(0); configuration.setPreAcknowledge(false); configuration.setBlockOnDurableSend(false); } @Test public void testSetters() { long v = random.nextLong(); producer.setDeliveryDelay(v); Assert.assertEquals(v, producer.getDeliveryDelay()); long l = random.nextLong(); producer.setTimeToLive(l); Assert.assertEquals(l, producer.getTimeToLive()); String id = "ID: jms2-tests-correlation-id" + random.nextLong(); producer.setJMSCorrelationID(id); Assert.assertEquals(id, producer.getJMSCorrelationID()); //set a property of an invalid type (ArrayList) try { producer.setProperty("name1", new ArrayList<String>(2)); fail("didn't get expected MessageFormatRuntimeException"); } catch (MessageFormatRuntimeException e) { //expected. } } @Test public void testDisMsgID() { producer.setDisableMessageID(true); Assert.assertEquals(true, producer.getDisableMessageID()); producer.setDisableMessageID(false); Assert.assertEquals(false, producer.getDisableMessageID()); } @Test public void multipleSendsUsingSetters() throws Exception { server.createQueue(SimpleString.toSimpleString("q1"), RoutingType.ANYCAST, SimpleString.toSimpleString("q1"), null, true, false); Queue q1 = context.createQueue("q1"); context.createProducer().setProperty("prop1", 1).setProperty("prop2", 2).send(q1, "Text1"); context.createProducer().setProperty("prop1", 3).setProperty("prop2", 4).send(q1, "Text2"); for (int i = 0; i < 100; i++) { context.createProducer().send(q1, "Text" + i); } ActiveMQSession sessionUsed = (ActiveMQSession) (((ActiveMQJMSContext) context).getUsedSession()); ClientSessionImpl coreSession = (ClientSessionImpl) sessionUsed.getCoreSession(); // JMSConsumer is supposed to cache the producer, each call to createProducer is supposed to always return the same producer assertEquals(1, coreSession.cloneProducers().size()); JMSConsumer consumer = context.createConsumer(q1); TextMessage text = (TextMessage) consumer.receive(5000); assertNotNull(text); assertEquals("Text1", text.getText()); assertEquals(1, text.getIntProperty("prop1")); assertEquals(2, text.getIntProperty("prop2")); text = (TextMessage) consumer.receive(5000); assertNotNull(text); assertEquals("Text2", text.getText()); assertEquals(3, text.getIntProperty("prop1")); assertEquals(4, text.getIntProperty("prop2")); for (int i = 0; i < 100; i++) { assertEquals("Text" + i, consumer.receiveBody(String.class, 1000)); } consumer.close(); context.close(); } @Test public void defaultAutoCreatedQueueConfigTest() throws Exception { final String queueName = "q1"; server.getAddressSettingsRepository().addMatch(queueName, new AddressSettings().setDefaultMaxConsumers(5).setDefaultPurgeOnNoConsumers(true)); Queue q1 = context.createQueue(queueName); context.createProducer().setProperty("prop1", 1).setProperty("prop2", 2).send(q1, "Text1"); org.apache.activemq.artemis.core.server.Queue queue = server.locateQueue(SimpleString.toSimpleString(queueName)); assertEquals(5, queue.getMaxConsumers()); assertEquals(true, queue.isPurgeOnNoConsumers()); } @Test public void defaultAutoCreatedQueueConfigTest2() throws Exception { final String queueName = "q1"; server.getAddressSettingsRepository().addMatch(queueName, new AddressSettings().setDefaultMaxConsumers(5).setDefaultPurgeOnNoConsumers(true)); Connection connection = cf.createConnection(); Session session = connection.createSession(); session.createProducer(session.createQueue(queueName)); org.apache.activemq.artemis.core.server.Queue queue = server.locateQueue(SimpleString.toSimpleString(queueName)); assertEquals(5, queue.getMaxConsumers()); assertEquals(true, queue.isPurgeOnNoConsumers()); connection.close(); } @Test public void testDeliveryMode() { producer.setDeliveryMode(DeliveryMode.PERSISTENT); Assert.assertEquals(DeliveryMode.PERSISTENT, producer.getDeliveryMode()); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); Assert.assertEquals(DeliveryMode.NON_PERSISTENT, producer.getDeliveryMode()); } @Test public void testGetNonExistentProperties() throws Exception { Throwable expected = null; { //byte byte value0 = 0; try { value0 = Byte.valueOf(null); } catch (Throwable t) { expected = t; } try { byte value1 = producer.getByteProperty("testGetNonExistentProperties"); if (expected == null) { assertTrue("value0: " + value0 + " value1: " + value1, value1 == value0); } else { fail("non existent byte property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //boolean expected = null; boolean value0 = false; try { value0 = Boolean.valueOf(null); } catch (Throwable t) { expected = t; } try { boolean value1 = producer.getBooleanProperty("testGetNonExistentProperties"); if (expected == null) { assertEquals("value0: " + value0 + " value1: " + value1, value1, value0); } else { fail("non existent boolean property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //double expected = null; double value0 = 0; try { value0 = Double.valueOf(null); } catch (Throwable t) { expected = t; } try { double value1 = producer.getDoubleProperty("testGetNonExistentProperties"); if (expected == null) { assertTrue("value0: " + value0 + " value1: " + value1, value1 == value0); } else { fail("non existent double property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //float expected = null; float value0 = 0; try { value0 = Float.valueOf(null); } catch (Throwable t) { expected = t; } try { float value1 = producer.getFloatProperty("testGetNonExistentProperties"); if (expected == null) { assertTrue("value0: " + value0 + " value1: " + value1, value1 == value0); } else { fail("non existent double property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //int expected = null; int value0 = 0; try { value0 = Integer.valueOf(null); } catch (Throwable t) { expected = t; } try { int value1 = producer.getIntProperty("testGetNonExistentProperties"); if (expected == null) { assertTrue("value0: " + value0 + " value1: " + value1, value1 == value0); } else { fail("non existent double property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //long expected = null; long value0 = 0; try { value0 = Integer.valueOf(null); } catch (Throwable t) { expected = t; } try { long value1 = producer.getLongProperty("testGetNonExistentProperties"); if (expected == null) { assertEquals("value0: " + value0 + " value1: " + value1, value1, value0); } else { fail("non existent double property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //short expected = null; short value0 = 0; try { value0 = Short.valueOf(null); } catch (Throwable t) { expected = t; } try { short value1 = producer.getShortProperty("testGetNonExistentProperties"); if (expected == null) { assertTrue("value0: " + value0 + " value1: " + value1, value1 == value0); } else { fail("non existent double property expects exception, but got value: " + value1); } } catch (Throwable t) { if (expected == null) throw t; if (!t.getClass().equals(expected.getClass())) { throw new Exception("Expected exception: " + expected.getClass().getName() + " but got: " + t.getClass(), t); } } } { //Object Object value0 = producer.getObjectProperty("testGetNonExistentProperties"); assertNull(value0); //String Object value1 = producer.getStringProperty("testGetNonExistentProperties"); assertNull(value1); } } }