/*
* 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.jms.tests;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.util.HashSet;
import java.util.Set;
import org.apache.activemq.artemis.jms.tests.util.ProxyAssertSupport;
import org.junit.Test;
public class QueueTest extends JMSTestCase {
/**
* The simplest possible queue test.
*/
@Test
public void testQueue() throws Exception {
Connection conn = null;
try {
conn = createConnection();
Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer p = s.createProducer(queue1);
MessageConsumer c = s.createConsumer(queue1);
conn.start();
p.send(s.createTextMessage("payload"));
TextMessage m = (TextMessage) c.receive(5000);
ProxyAssertSupport.assertEquals("payload", m.getText());
} finally {
if (conn != null) {
conn.close();
}
}
}
// http://jira.jboss.com/jira/browse/JBMESSAGING-1101
@Test
public void testBytesMessagePersistence() throws Exception {
Connection conn = null;
byte[] bytes = new byte[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 123, 55, 0, 12, -100, -11};
conn = createConnection();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sess.createProducer(queue1);
prod.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 1; i++) {
BytesMessage bm = sess.createBytesMessage();
bm.writeBytes(bytes);
prod.send(bm);
}
conn.close();
stop();
startNoDelete();
// ActiveMQ Artemis server restart implies new ConnectionFactory lookup
deployAndLookupAdministeredObjects();
conn = createConnection();
sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
MessageConsumer cons = sess.createConsumer(queue1);
for (int i = 0; i < 1; i++) {
BytesMessage bm = (BytesMessage) cons.receive(3000);
ProxyAssertSupport.assertNotNull(bm);
byte[] bytes2 = new byte[bytes.length];
bm.readBytes(bytes2);
for (int j = 0; j < bytes.length; j++) {
ProxyAssertSupport.assertEquals(bytes[j], bytes2[j]);
}
}
}
// added for http://jira.jboss.org/jira/browse/JBMESSAGING-899
@Test
public void testClosedConsumerAfterStart() throws Exception {
// This loop is to increase chances of a failure.
for (int counter = 0; counter < 20; counter++) {
Connection conn1 = null;
Connection conn2 = null;
try {
conn1 = createConnection();
conn2 = createConnection();
Session s = conn1.createSession(true, Session.SESSION_TRANSACTED);
MessageProducer p = s.createProducer(queue1);
for (int i = 0; i < 20; i++) {
p.send(s.createTextMessage("message " + i));
}
s.commit();
Session s2 = conn2.createSession(true, Session.SESSION_TRANSACTED);
// Create a consumer, start the session, close the consumer..
// This shouldn't cause any message to be lost
MessageConsumer c2 = s2.createConsumer(queue1);
conn2.start();
c2.close();
c2 = s2.createConsumer(queue1);
// There is a possibility the messages arrive out of order if they hit the closed
// consumer and are cancelled back before delivery to the other consumer has finished.
// There is nothing much we can do about this
Set<String> texts = new HashSet<>();
for (int i = 0; i < 20; i++) {
TextMessage txt = (TextMessage) c2.receive(5000);
ProxyAssertSupport.assertNotNull(txt);
texts.add(txt.getText());
}
for (int i = 0; i < 20; i++) {
ProxyAssertSupport.assertTrue(texts.contains("message " + i));
}
s2.commit();
checkEmpty(queue1);
} finally {
if (conn1 != null) {
conn1.close();
}
if (conn2 != null) {
conn2.close();
}
}
}
}
@Test
public void testRedeployQueue() throws Exception {
Connection conn = createConnection();
Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer p = s.createProducer(queue1);
MessageConsumer c = s.createConsumer(queue1);
conn.start();
for (int i = 0; i < 500; i++) {
p.send(s.createTextMessage("payload " + i));
}
conn.close();
stop();
startNoDelete();
deployAndLookupAdministeredObjects();
conn = createConnection();
s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
p = s.createProducer(queue1);
c = s.createConsumer(queue1);
conn.start();
for (int i = 0; i < 500; i++) {
TextMessage message = (TextMessage) c.receive(3000);
ProxyAssertSupport.assertNotNull(message);
ProxyAssertSupport.assertNotNull(message.getJMSDestination());
}
}
@Test
public void testQueueName() throws Exception {
ProxyAssertSupport.assertEquals("Queue1", queue1.getQueueName());
}
}