/* * 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.openwire.interop; import javax.jms.BytesMessage; import javax.jms.Connection; import javax.jms.MapMessage; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.Session; import javax.jms.StreamMessage; import javax.jms.TextMessage; import java.io.Serializable; import java.nio.charset.StandardCharsets; import org.apache.activemq.ActiveMQMessageConsumer; import org.apache.activemq.ActiveMQMessageProducer; import org.apache.activemq.artemis.api.core.client.ServerLocator; import org.apache.activemq.artemis.tests.integration.openwire.BasicOpenWireTest; import org.apache.activemq.command.ActiveMQDestination; import org.junit.Before; import org.junit.Test; /** * This test covers interactions between core clients and * openwire clients, i.e. core producers sending messages * to be received by openwire receivers, and vice versa. */ public class GeneralInteropTest extends BasicOpenWireTest { private ServerLocator locator; @Before @Override public void setUp() throws Exception { super.setUp(); locator = this.createInVMNonHALocator(); } @Test public void testReceivingFromCore() throws Exception { final String text = "HelloWorld"; //text messages sendTextMessageUsingCoreJms(queueName, text); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session.createConsumer(destination); TextMessage textMessage = (TextMessage) consumer.receive(5000); assertEquals(text, textMessage.getText()); assertEquals(destination, textMessage.getJMSDestination()); //map messages sendMapMessageUsingCoreJms(queueName); MapMessage mapMessage = (MapMessage) consumer.receive(5000); assertEquals(destination, mapMessage.getJMSDestination()); assertTrue(mapMessage.getBoolean("aboolean")); assertEquals((byte) 4, mapMessage.getByte("abyte")); byte[] bytes = mapMessage.getBytes("abytes"); assertEquals(2, bytes.length); assertEquals((byte) 4, bytes[0]); assertEquals((byte) 5, bytes[1]); assertEquals('a', mapMessage.getChar("achar")); Double doubleVal = mapMessage.getDouble("adouble"); assertTrue(doubleVal.equals(Double.valueOf(4.4))); Float floatVal = mapMessage.getFloat("afloat"); assertTrue(floatVal.equals(Float.valueOf(4.5F))); assertEquals(40, mapMessage.getInt("aint")); assertEquals(80L, mapMessage.getLong("along")); assertEquals(65, mapMessage.getShort("ashort")); assertEquals("hello", mapMessage.getString("astring")); //object message SimpleSerializable obj = new SimpleSerializable(); sendObjectMessageUsingCoreJms(queueName, obj); ObjectMessage objectMessage = (ObjectMessage) consumer.receive(5000); SimpleSerializable data = (SimpleSerializable) objectMessage.getObject(); assertEquals(obj.objName, data.objName); assertEquals(obj.intVal, data.intVal); assertEquals(obj.longVal, data.longVal); //stream messages sendStreamMessageUsingCoreJms(queueName); StreamMessage streamMessage = (StreamMessage) consumer.receive(5000); assertEquals(destination, streamMessage.getJMSDestination()); assertTrue(streamMessage.readBoolean()); assertEquals((byte) 2, streamMessage.readByte()); byte[] streamBytes = new byte[2]; streamMessage.readBytes(streamBytes); assertEquals(6, streamBytes[0]); assertEquals(7, streamBytes[1]); assertEquals('b', streamMessage.readChar()); Double streamDouble = streamMessage.readDouble(); assertTrue(streamDouble.equals(Double.valueOf(6.5))); Float streamFloat = streamMessage.readFloat(); assertTrue(streamFloat.equals(Float.valueOf(93.9F))); assertEquals(7657, streamMessage.readInt()); assertEquals(239999L, streamMessage.readLong()); assertEquals((short) 34222, streamMessage.readShort()); assertEquals("hello streammessage", streamMessage.readString()); //bytes messages final byte[] bytesData = text.getBytes(StandardCharsets.UTF_8); sendBytesMessageUsingCoreJms(queueName, bytesData); BytesMessage bytesMessage = (BytesMessage) consumer.receive(5000); byte[] rawBytes = new byte[bytesData.length]; bytesMessage.readBytes(rawBytes); for (int i = 0; i < bytesData.length; i++) { assertEquals("failed at " + i, bytesData[i], rawBytes[i]); } assertTrue(bytesMessage.readBoolean()); assertEquals(99999L, bytesMessage.readLong()); assertEquals('h', bytesMessage.readChar()); assertEquals(987, bytesMessage.readInt()); assertEquals((short) 1099, bytesMessage.readShort()); assertEquals("hellobytes", bytesMessage.readUTF()); //generic message sendMessageUsingCoreJms(queueName); javax.jms.Message genericMessage = consumer.receive(5000); assertEquals(destination, genericMessage.getJMSDestination()); String value = genericMessage.getStringProperty("stringProperty"); assertEquals("HelloMessage", value); assertFalse(genericMessage.getBooleanProperty("booleanProperty")); assertEquals(99999L, genericMessage.getLongProperty("longProperty")); assertEquals(979, genericMessage.getIntProperty("intProperty")); assertEquals((short) 1099, genericMessage.getShortProperty("shortProperty")); assertEquals("HelloMessage", genericMessage.getStringProperty("stringProperty")); } @Test public void testMutipleReceivingFromCore() throws Exception { final String text = "HelloWorld"; final int num = 100; //text messages sendMultipleTextMessagesUsingCoreJms(queueName, text, 100); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); final ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session.createConsumer(destination); for (int i = 0; i < num; i++) { TextMessage textMessage = (TextMessage) consumer.receive(5000); assertEquals(text + i, textMessage.getText()); assertEquals(destination, textMessage.getJMSDestination()); } } private void sendMultipleTextMessagesUsingCoreJms(String queueName, String text, int num) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); for (int i = 0; i < num; i++) { TextMessage msg = session.createTextMessage(text + i); producer.send(msg); } } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendMessageUsingCoreJms(String queueName) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); javax.jms.Message message = session.createMessage(); message.setBooleanProperty("booleanProperty", false); message.setLongProperty("longProperty", 99999L); message.setByteProperty("byteProperty", (byte) 5); message.setIntProperty("intProperty", 979); message.setShortProperty("shortProperty", (short) 1099); message.setStringProperty("stringProperty", "HelloMessage"); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); producer.send(message); } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendBytesMessageUsingCoreJms(String queueName, byte[] data) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); BytesMessage bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes(data); bytesMessage.writeBoolean(true); bytesMessage.writeLong(99999L); bytesMessage.writeChar('h'); bytesMessage.writeInt(987); bytesMessage.writeShort((short) 1099); bytesMessage.writeUTF("hellobytes"); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); producer.send(bytesMessage); } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendObjectMessageUsingCoreJms(String queueName, Serializable object) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); ObjectMessage objectMessage = session.createObjectMessage(object); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); producer.send(objectMessage); } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendStreamMessageUsingCoreJms(String queueName) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); StreamMessage msg = session.createStreamMessage(); msg.writeBoolean(true); msg.writeByte((byte) 2); msg.writeBytes(new byte[]{6, 7}); msg.writeChar('b'); msg.writeDouble(6.5); msg.writeFloat((float) 93.9); msg.writeInt(7657); msg.writeLong(239999L); msg.writeShort((short) 34222); msg.writeString("hello streammessage"); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); producer.send(msg); } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendMapMessageUsingCoreJms(String queueName) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); MapMessage mapMessage = session.createMapMessage(); mapMessage.setBoolean("aboolean", true); mapMessage.setByte("abyte", (byte) 4); mapMessage.setBytes("abytes", new byte[]{4, 5}); mapMessage.setChar("achar", 'a'); mapMessage.setDouble("adouble", 4.4); mapMessage.setFloat("afloat", 4.5f); mapMessage.setInt("aint", 40); mapMessage.setLong("along", 80L); mapMessage.setShort("ashort", (short) 65); mapMessage.setString("astring", "hello"); Queue queue = session.createQueue(queueName); MessageProducer producer = session.createProducer(queue); producer.send(mapMessage); } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendTextMessageUsingCoreJms(String address, String text) throws Exception { Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); TextMessage msg = session.createTextMessage(text); Queue queue = session.createQueue(address); MessageProducer producer = session.createProducer(queue); producer.send(msg); } finally { if (jmsConn != null) { jmsConn.close(); } } } @Test public void testSendingToCoreJms() throws Exception { final String text = "HelloWorld"; Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); jmsConn.start(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(this.queueName); MessageConsumer coreConsumer = session.createConsumer(queue); //text messages sendTextMessageUsingOpenWire(text); TextMessage txtMessage = (TextMessage) coreConsumer.receive(5000); assertEquals(text, txtMessage.getText()); assertEquals(txtMessage.getJMSDestination(), queue); // map messages sendMapMessageUsingOpenWire(); MapMessage mapMessage = (MapMessage) coreConsumer.receive(5000); assertEquals(mapMessage.getJMSDestination(), queue); assertTrue(mapMessage.getBoolean("aboolean")); assertEquals((byte) 4, mapMessage.getByte("abyte")); byte[] bytes = mapMessage.getBytes("abytes"); assertEquals(2, bytes.length); assertEquals((byte) 4, bytes[0]); assertEquals((byte) 5, bytes[1]); assertEquals('a', mapMessage.getChar("achar")); Double doubleVal = mapMessage.getDouble("adouble"); assertTrue(doubleVal.equals(Double.valueOf(4.4))); Float floatVal = mapMessage.getFloat("afloat"); assertTrue(floatVal.equals(Float.valueOf(4.5F))); assertEquals(40, mapMessage.getInt("aint")); assertEquals(80L, mapMessage.getLong("along")); assertEquals(65, mapMessage.getShort("ashort")); assertEquals("hello", mapMessage.getString("astring")); //object message SimpleSerializable obj = new SimpleSerializable(); sendObjectMessageUsingOpenWire(obj); ObjectMessage objectMessage = (ObjectMessage) coreConsumer.receive(5000); assertEquals(objectMessage.getJMSDestination(), queue); SimpleSerializable data = (SimpleSerializable) objectMessage.getObject(); assertEquals(obj.objName, data.objName); assertEquals(obj.intVal, data.intVal); assertEquals(obj.longVal, data.longVal); //stream messages sendStreamMessageUsingOpenWire(queueName); StreamMessage streamMessage = (StreamMessage) coreConsumer.receive(5000); assertEquals(streamMessage.getJMSDestination(), queue); assertTrue(streamMessage.readBoolean()); assertEquals((byte) 2, streamMessage.readByte()); byte[] streamBytes = new byte[2]; streamMessage.readBytes(streamBytes); assertEquals(6, streamBytes[0]); assertEquals(7, streamBytes[1]); assertEquals('b', streamMessage.readChar()); Double streamDouble = streamMessage.readDouble(); assertTrue(streamDouble.equals(Double.valueOf(6.5))); Float streamFloat = streamMessage.readFloat(); assertTrue(streamFloat.equals(Float.valueOf(93.9F))); assertEquals(7657, streamMessage.readInt()); assertEquals(239999L, streamMessage.readLong()); assertEquals((short) 34222, streamMessage.readShort()); assertEquals("hello streammessage", streamMessage.readString()); //bytes messages final byte[] bytesData = text.getBytes(StandardCharsets.UTF_8); sendBytesMessageUsingOpenWire(bytesData); BytesMessage bytesMessage = (BytesMessage) coreConsumer.receive(5000); assertEquals(bytesMessage.getJMSDestination(), queue); byte[] rawBytes = new byte[bytesData.length]; bytesMessage.readBytes(rawBytes); for (int i = 0; i < bytesData.length; i++) { assertEquals(bytesData[i], rawBytes[i]); } //generic message sendMessageUsingOpenWire(queueName); javax.jms.Message genericMessage = coreConsumer.receive(5000); assertEquals(genericMessage.getJMSDestination(), queue); String value = genericMessage.getStringProperty("stringProperty"); assertEquals("HelloMessage", value); assertFalse(genericMessage.getBooleanProperty("booleanProperty")); assertEquals(99999L, genericMessage.getLongProperty("longProperty")); assertEquals(979, genericMessage.getIntProperty("intProperty")); assertEquals((short) 1099, genericMessage.getShortProperty("shortProperty")); assertEquals("HelloMessage", genericMessage.getStringProperty("stringProperty")); } finally { if (jmsConn != null) { jmsConn.close(); } } } @Test public void testMultipleSendingToCoreJms() throws Exception { final String text = "HelloWorld"; final int num = 100; Connection jmsConn = null; try { jmsConn = coreCf.createConnection(); jmsConn.start(); Session session = jmsConn.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(this.queueName); MessageConsumer coreConsumer = session.createConsumer(queue); //text messages sendMultipleTextMessagesUsingOpenWire(text, num); for (int i = 0; i < num; i++) { TextMessage txtMessage = (TextMessage) coreConsumer.receive(5000); assertEquals(txtMessage.getJMSDestination(), queue); assertEquals(text + i, txtMessage.getText()); } } finally { if (jmsConn != null) { jmsConn.close(); } } } private void sendMultipleTextMessagesUsingOpenWire(String text, int num) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); for (int i = 0; i < num; i++) { TextMessage textMessage = session.createTextMessage(text + i); producer.send(textMessage); } } private void sendMessageUsingOpenWire(String queueName) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); javax.jms.Message message = session.createMessage(); message.setBooleanProperty("booleanProperty", false); message.setLongProperty("longProperty", 99999L); message.setByteProperty("byteProperty", (byte) 5); message.setIntProperty("intProperty", 979); message.setShortProperty("shortProperty", (short) 1099); message.setStringProperty("stringProperty", "HelloMessage"); producer.send(message); } private void sendBytesMessageUsingOpenWire(byte[] bytesData) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); BytesMessage bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes(bytesData); bytesMessage.writeBoolean(true); bytesMessage.writeLong(99999L); bytesMessage.writeChar('h'); bytesMessage.writeInt(987); bytesMessage.writeShort((short) 1099); bytesMessage.writeUTF("hellobytes"); producer.send(bytesMessage); } private void sendStreamMessageUsingOpenWire(String queueName) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); StreamMessage streamMessage = session.createStreamMessage(); streamMessage.writeBoolean(true); streamMessage.writeByte((byte) 2); streamMessage.writeBytes(new byte[]{6, 7}); streamMessage.writeChar('b'); streamMessage.writeDouble(6.5); streamMessage.writeFloat((float) 93.9); streamMessage.writeInt(7657); streamMessage.writeLong(239999L); streamMessage.writeShort((short) 34222); streamMessage.writeString("hello streammessage"); producer.send(streamMessage); } private void sendObjectMessageUsingOpenWire(SimpleSerializable obj) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); ObjectMessage objectMessage = session.createObjectMessage(obj); producer.send(objectMessage); } private void sendMapMessageUsingOpenWire() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); System.out.println("destination: " + destination); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); MapMessage mapMessage = session.createMapMessage(); mapMessage.setBoolean("aboolean", true); mapMessage.setByte("abyte", (byte) 4); mapMessage.setBytes("abytes", new byte[]{4, 5}); mapMessage.setChar("achar", 'a'); mapMessage.setDouble("adouble", 4.4); mapMessage.setFloat("afloat", 4.5f); mapMessage.setInt("aint", 40); mapMessage.setLong("along", 80L); mapMessage.setShort("ashort", (short) 65); mapMessage.setString("astring", "hello"); producer.send(mapMessage); } private void sendTextMessageUsingOpenWire(String text) throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = createDestination(session, ActiveMQDestination.QUEUE_TYPE); final ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination); TextMessage textMessage = session.createTextMessage(text); producer.send(textMessage); } private static class SimpleSerializable implements Serializable { private static final long serialVersionUID = -1034113865185130710L; public String objName = "simple-serializable"; public int intVal = 9999; public long longVal = 88888888L; } }