/* * 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.paging; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.client.ClientConsumer; import org.apache.activemq.artemis.api.core.client.ClientMessage; import org.apache.activemq.artemis.api.core.client.ClientProducer; import org.apache.activemq.artemis.api.core.client.ClientSession; import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; import org.apache.activemq.artemis.api.core.client.ServerLocator; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.logs.AssertionLoggerHandler; import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; import org.apache.activemq.artemis.utils.RandomUtil; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class PageCountSyncOnNonTXTest extends ActiveMQTestBase { public static final String WORD_START = "&*STARTED&*"; // We will add a random factor on the wait time private long timeToRun; Process process; @Before public void checkLoggerStart() throws Exception { AssertionLoggerHandler.startCapture(); } @After public void checkLoggerEnd() throws Exception { try { // These are the message errors for the negative size address size Assert.assertFalse(AssertionLoggerHandler.findText("222214")); Assert.assertFalse(AssertionLoggerHandler.findText("222215")); } finally { AssertionLoggerHandler.stopCapture(); } } @Override @Before public void setUp() throws Exception { super.setUp(); timeToRun = 30000 + RandomUtil.randomPositiveInt() % 1000; } @Test public void testSendNoTx() throws Exception { String QUEUE_NAME = "myQueue"; final CountDownLatch latch = new CountDownLatch(1); Runnable runnable = new Runnable() { @Override public void run() { latch.countDown(); } }; process = PageCountSyncServer.spawnVMWithLogMacher(WORD_START, runnable, getTestDir(), timeToRun); assertTrue("Server didn't start in 30 seconds", latch.await(30, TimeUnit.SECONDS)); ServerLocator locator = createNettyNonHALocator(); try { locator = createNettyNonHALocator().setReconnectAttempts(0).setInitialConnectAttempts(10).setRetryInterval(500).setBlockOnDurableSend(false); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession(true, true); session.createQueue(QUEUE_NAME, QUEUE_NAME, true); ClientProducer producer = session.createProducer(QUEUE_NAME); ClientConsumer consumer = session.createConsumer(QUEUE_NAME); session.start(); ClientSession sessionTransacted = factory.createSession(false, false); ClientProducer producerTransacted = sessionTransacted.createProducer(QUEUE_NAME); ClientConsumer consumerTransacted = sessionTransacted.createConsumer(QUEUE_NAME); sessionTransacted.start(); long start = System.currentTimeMillis(); long nmsgs = 0; try { while (true) { int size = RandomUtil.randomPositiveInt() % 1024; if (size == 0) { size = 1024; } ClientMessage msg = session.createMessage(true); msg.getBodyBuffer().writeBytes(new byte[size]); producer.send(msg); if (++nmsgs % 100 == 0) { // complicating the test a bit with transacted sends and consuming producerTransacted.send(msg); for (int i = 0; i < 50; i++) { msg = consumerTransacted.receive(100); if (msg != null) { msg.acknowledge(); } } sessionTransacted.commit(); msg = consumer.receive(100); if (msg != null) { msg.acknowledge(); } } if (System.currentTimeMillis() - start > timeToRun) { // this will ensure to capture a failure since the server will have crashed session.commit(); } } } catch (Exception expected) { expected.printStackTrace(); } } finally { locator.close(); } assertEquals("Process didn't end as expected", 1, process.waitFor()); ActiveMQServer server = SpawnedServerSupport.createServer(getTestDir()); try { server.start(); Thread.sleep(500); locator = createNettyNonHALocator(); try { Queue queue = server.locateQueue(new SimpleString(QUEUE_NAME)); assertNotNull(queue); long msgs = getMessageCount(queue); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession(false, false); ClientConsumer consumer = session.createConsumer(QUEUE_NAME, false); session.start(); for (int i = 0; i < msgs; i++) { ClientMessage msg = consumer.receive(5000); assertNotNull(msg); // msg.acknowledge(); -- we don't ack // because in case of a failure we can check data with print-data } assertNull(consumer.receiveImmediate()); session.close(); } finally { locator.close(); } } finally { server.stop(); } } }