/*
* 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.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.artemis.jms.tests.util.ProxyAssertSupport;
import org.junit.Test;
public class PersistenceTest extends JMSTestCase {
/**
* Test that the messages in a persistent queue survive starting and stopping and server,
*/
@Test
public void testQueuePersistence() throws Exception {
Connection conn = null;
try {
conn = createConnection();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sess.createProducer(queue1);
prod.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 10; i++) {
TextMessage tm = sess.createTextMessage("message" + i);
prod.send(tm);
}
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 < 10; i++) {
TextMessage tm = (TextMessage) cons.receive(3000);
ProxyAssertSupport.assertNotNull(tm);
if (tm == null) {
break;
}
ProxyAssertSupport.assertEquals("message" + i, tm.getText());
}
} finally {
if (conn != null) {
conn.close();
}
}
}
/**
* Test that the JMSRedelivered and delivery count survives a restart
*/
@Test
public void testJMSRedeliveredRestart() throws Exception {
Connection conn = null;
try {
conn = createConnection();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sess.createProducer(queue1);
prod.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 10; i++) {
TextMessage tm = sess.createTextMessage("message" + i);
prod.send(tm);
}
Session sess2 = conn.createSession(true, Session.SESSION_TRANSACTED);
MessageConsumer cons = sess2.createConsumer(queue1);
conn.start();
for (int i = 0; i < 10; i++) {
TextMessage tm = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(tm);
ProxyAssertSupport.assertEquals("message" + i, tm.getText());
ProxyAssertSupport.assertFalse(tm.getJMSRedelivered());
ProxyAssertSupport.assertEquals(1, tm.getIntProperty("JMSXDeliveryCount"));
}
// rollback
sess2.rollback();
for (int i = 0; i < 10; i++) {
TextMessage tm = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(tm);
ProxyAssertSupport.assertEquals("message" + i, tm.getText());
ProxyAssertSupport.assertTrue(tm.getJMSRedelivered());
ProxyAssertSupport.assertEquals(2, tm.getIntProperty("JMSXDeliveryCount"));
}
conn.close();
stop();
startNoDelete();
// ActiveMQ Artemis server restart implies new ConnectionFactory lookup
deployAndLookupAdministeredObjects();
conn = createConnection();
sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
cons = sess.createConsumer(queue1);
for (int i = 0; i < 10; i++) {
TextMessage tm = (TextMessage) cons.receive(3000);
ProxyAssertSupport.assertNotNull(tm);
ProxyAssertSupport.assertEquals("message" + i, tm.getText());
ProxyAssertSupport.assertTrue(tm.getJMSRedelivered());
ProxyAssertSupport.assertEquals(3, tm.getIntProperty("JMSXDeliveryCount"));
}
} finally {
if (conn != null) {
conn.close();
}
}
}
/**
* First test that message order survives a restart
*/
@Test
public void testMessageOrderPersistence_1() throws Exception {
Connection conn = null;
try {
conn = createConnection();
Session sessSend = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sessSend.createProducer(queue1);
TextMessage m0 = sessSend.createTextMessage("a");
TextMessage m1 = sessSend.createTextMessage("b");
TextMessage m2 = sessSend.createTextMessage("c");
TextMessage m3 = sessSend.createTextMessage("d");
TextMessage m4 = sessSend.createTextMessage("e");
TextMessage m5 = sessSend.createTextMessage("f");
TextMessage m6 = sessSend.createTextMessage("g");
TextMessage m7 = sessSend.createTextMessage("h");
TextMessage m8 = sessSend.createTextMessage("i");
TextMessage m9 = sessSend.createTextMessage("j");
prod.send(m0, DeliveryMode.PERSISTENT, 0, 0);
prod.send(m1, DeliveryMode.PERSISTENT, 1, 0);
prod.send(m2, DeliveryMode.PERSISTENT, 2, 0);
prod.send(m3, DeliveryMode.PERSISTENT, 3, 0);
prod.send(m4, DeliveryMode.PERSISTENT, 4, 0);
prod.send(m5, DeliveryMode.PERSISTENT, 5, 0);
prod.send(m6, DeliveryMode.PERSISTENT, 6, 0);
prod.send(m7, DeliveryMode.PERSISTENT, 7, 0);
prod.send(m8, DeliveryMode.PERSISTENT, 8, 0);
prod.send(m9, DeliveryMode.PERSISTENT, 9, 0);
conn.close();
stop();
startNoDelete();
// ActiveMQ Artemis server restart implies new ConnectionFactory lookup
deployAndLookupAdministeredObjects();
conn = createConnection();
Session sessReceive = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
MessageConsumer cons = sessReceive.createConsumer(queue1);
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("j", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("i", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("h", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("g", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("f", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("e", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("d", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("c", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("b", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("a", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(500);
ProxyAssertSupport.assertNull(t);
}
} finally {
if (conn != null) {
conn.close();
}
}
}
/**
* Second test that message order survives a restart
*/
@Test
public void testMessageOrderPersistence_2() throws Exception {
Connection conn = null;
try {
conn = createConnection();
Session sessSend = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sessSend.createProducer(queue1);
TextMessage m0 = sessSend.createTextMessage("a");
TextMessage m1 = sessSend.createTextMessage("b");
TextMessage m2 = sessSend.createTextMessage("c");
TextMessage m3 = sessSend.createTextMessage("d");
TextMessage m4 = sessSend.createTextMessage("e");
TextMessage m5 = sessSend.createTextMessage("f");
TextMessage m6 = sessSend.createTextMessage("g");
TextMessage m7 = sessSend.createTextMessage("h");
TextMessage m8 = sessSend.createTextMessage("i");
TextMessage m9 = sessSend.createTextMessage("j");
prod.send(m0, DeliveryMode.PERSISTENT, 0, 0);
prod.send(m1, DeliveryMode.PERSISTENT, 0, 0);
prod.send(m2, DeliveryMode.PERSISTENT, 0, 0);
prod.send(m3, DeliveryMode.PERSISTENT, 3, 0);
prod.send(m4, DeliveryMode.PERSISTENT, 3, 0);
prod.send(m5, DeliveryMode.PERSISTENT, 4, 0);
prod.send(m6, DeliveryMode.PERSISTENT, 4, 0);
prod.send(m7, DeliveryMode.PERSISTENT, 5, 0);
prod.send(m8, DeliveryMode.PERSISTENT, 5, 0);
prod.send(m9, DeliveryMode.PERSISTENT, 6, 0);
conn.close();
stop();
startNoDelete();
deployAndLookupAdministeredObjects();
conn = createConnection();
Session sessReceive = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
MessageConsumer cons = sessReceive.createConsumer(queue1);
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("j", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("h", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("i", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("f", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("g", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("d", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("e", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("a", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("b", t.getText());
}
{
TextMessage t = (TextMessage) cons.receive(1000);
ProxyAssertSupport.assertNotNull(t);
ProxyAssertSupport.assertEquals("c", t.getText());
}
{
TextMessage t = (TextMessage) cons.receiveNoWait();
ProxyAssertSupport.assertNull(t);
}
} finally {
if (conn != null) {
conn.close();
}
}
}
/*
* Test durable subscription state survives a server crash
*/
@Test
public void testDurableSubscriptionPersistence_1() throws Exception {
Connection conn = null;
try {
conn = createConnection();
conn.setClientID("five");
Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer ds = s.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub", null, false);
MessageProducer p = s.createProducer(ActiveMQServerTestCase.topic1);
p.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage tm = s.createTextMessage("thebody");
p.send(tm);
log.debug("message sent");
conn.close();
stop();
startNoDelete();
deployAndLookupAdministeredObjects();
conn = createConnection();
conn.setClientID("five");
s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
ds = s.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub", null, false);
TextMessage rm = (TextMessage) ds.receive(3000);
ProxyAssertSupport.assertNotNull(rm);
ProxyAssertSupport.assertEquals("thebody", rm.getText());
ds.close();
s.unsubscribe("sub");
} finally {
if (conn != null) {
conn.close();
}
}
}
/*
* Test durable subscription state survives a restart
*/
@Test
public void testDurableSubscriptionPersistence_2() throws Exception {
Connection conn = null;
try {
conn = createConnection();
conn.setClientID("Sausages");
Session sessConsume = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer sub1 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub1", null, false);
MessageConsumer sub2 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub2", null, false);
MessageConsumer sub3 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub3", null, false);
Session sessSend = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod = sessSend.createProducer(ActiveMQServerTestCase.topic1);
prod.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 10; i++) {
TextMessage tm = sessSend.createTextMessage("message" + i);
prod.send(tm);
}
conn.close();
stop();
startNoDelete();
// ActiveMQ Artemis server restart implies new ConnectionFactory lookup
deployAndLookupAdministeredObjects();
conn = createConnection();
conn.setClientID("Sausages");
sessConsume = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
sub1 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub1", null, false);
sub2 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub2", null, false);
sub3 = sessConsume.createDurableSubscriber(ActiveMQServerTestCase.topic1, "sub3", null, false);
for (int i = 0; i < 10; i++) {
TextMessage tm1 = (TextMessage) sub1.receive(3000);
ProxyAssertSupport.assertNotNull(tm1);
if (tm1 == null) {
break;
}
ProxyAssertSupport.assertEquals("message" + i, tm1.getText());
TextMessage tm2 = (TextMessage) sub2.receive(3000);
ProxyAssertSupport.assertNotNull(tm2);
if (tm2 == null) {
break;
}
ProxyAssertSupport.assertEquals("message" + i, tm2.getText());
TextMessage tm3 = (TextMessage) sub3.receive(3000);
ProxyAssertSupport.assertNotNull(tm3);
if (tm3 == null) {
break;
}
ProxyAssertSupport.assertEquals("message" + i, tm3.getText());
}
sub1.close();
sub2.close();
sub3.close();
sessConsume.unsubscribe("sub1");
sessConsume.unsubscribe("sub2");
sessConsume.unsubscribe("sub3");
} finally {
if (conn != null) {
conn.close();
}
}
}
}