/* * JBoss, Home of Professional Open Source Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors by * the @authors tag. See the copyright.txt in the distribution for a full listing of individual contributors. This is * free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. You should have received a copy of the GNU Lesser General Public License along with this software; if not, * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF * site: http://www.fsf.org. */ package org.jboss.messaging.tests.integration.cluster; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import junit.framework.TestCase; import org.jboss.messaging.core.client.ClientConsumer; import org.jboss.messaging.core.client.ClientMessage; import org.jboss.messaging.core.client.ClientProducer; import org.jboss.messaging.core.client.ClientSession; import org.jboss.messaging.core.client.ClientSessionFactory; import org.jboss.messaging.core.client.MessageHandler; import org.jboss.messaging.core.client.impl.ClientSessionFactoryImpl; import org.jboss.messaging.core.client.impl.ClientSessionImpl; import org.jboss.messaging.core.config.Configuration; import org.jboss.messaging.core.config.TransportConfiguration; import org.jboss.messaging.core.config.impl.ConfigurationImpl; import org.jboss.messaging.core.exception.MessagingException; import org.jboss.messaging.core.logging.Logger; import org.jboss.messaging.core.remoting.impl.ConnectionRegistryImpl; import org.jboss.messaging.core.remoting.impl.RemotingConnectionImpl; import org.jboss.messaging.core.remoting.impl.invm.InVMRegistry; import org.jboss.messaging.core.remoting.impl.invm.TransportConstants; import org.jboss.messaging.core.server.MessagingService; import org.jboss.messaging.core.server.impl.MessagingServiceImpl; import org.jboss.messaging.jms.client.JBossTextMessage; import org.jboss.messaging.util.SimpleString; /** * A MultiThreadRandomFailoverTest * * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a> */ public class MultiThreadRandomFailoverTest extends TestCase { private static final Logger log = Logger.getLogger(MultiThreadRandomFailoverTest.class); // Constants ----------------------------------------------------- private static final int RECEIVE_TIMEOUT = 5000; private static final int NUM_THREADS = 10; // Attributes ---------------------------------------------------- private static final SimpleString ADDRESS = new SimpleString("FailoverTestAddress"); private MessagingService liveService; private MessagingService backupService; private final Map<String, Object> backupParams = new HashMap<String, Object>(); private Timer timer; // Static -------------------------------------------------------- // Constructors -------------------------------------------------- // Public -------------------------------------------------------- public void testA() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestA(sf, threadNum); } }, NUM_THREADS); } public void testB() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestB(sf, threadNum); } }, NUM_THREADS); } public void testC() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestC(sf, threadNum); } }, NUM_THREADS); } public void testD() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestD(sf, threadNum); } }, NUM_THREADS); } public void testE() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestE(sf, threadNum); } }, NUM_THREADS); } public void testF() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestF(sf, threadNum); } }, NUM_THREADS); } public void testG() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestG(sf, threadNum); } }, NUM_THREADS); } public void testH() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestH(sf, threadNum); } }, NUM_THREADS); } public void testI() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestI(sf, threadNum); } }, NUM_THREADS); } public void testJ() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestJ(sf, threadNum); } }, NUM_THREADS); } public void testK() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestK(sf, threadNum); } }, NUM_THREADS); } public void testL() throws Exception { runTestMultipleThreads(new RunnableT() { public void run(final ClientSessionFactory sf, final int threadNum) throws Exception { doTestL(sf); } }, NUM_THREADS); } // Package protected --------------------------------------------- // Protected ----------------------------------------------------- protected void doTestA(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, true, true, false); sessConsume.start(); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } class MyHandler implements MessageHandler { final CountDownLatch latch = new CountDownLatch(1); volatile int count; public void onMessage(ClientMessage message) { try { message.acknowledge(); } catch (MessagingException me) { log.error("Failed to process", me); } if (count >= numMessages) { return; } count++; if (count == numMessages) { latch.countDown(); } } } Set<MyHandler> handlers = new HashSet<MyHandler>(); for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(5000, TimeUnit.MILLISECONDS); assertTrue("Didn't receive all messages", ok); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestB(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, true, true, false); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } for (ClientSession session : sessions) { session.start(); } class MyHandler implements MessageHandler { final CountDownLatch latch = new CountDownLatch(1); volatile int count; public void onMessage(ClientMessage message) { try { message.acknowledge(); } catch (MessagingException me) { log.error("Failed to process", me); } if (count >= numMessages) { return; } count++; if (count == numMessages) { latch.countDown(); } } } Set<MyHandler> handlers = new HashSet<MyHandler>(); for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(10000, TimeUnit.MILLISECONDS); assertTrue(ok); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestC(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, false, false, false); sessConsume.start(); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.rollback(); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.commit(); class MyHandler implements MessageHandler { final CountDownLatch latch = new CountDownLatch(1); volatile int count; public void onMessage(ClientMessage message) { try { message.acknowledge(); } catch (MessagingException me) { log.error("Failed to process", me); } if (count >= numMessages) { return; } count++; if (count == numMessages) { latch.countDown(); } } } Set<MyHandler> handlers = new HashSet<MyHandler>(); for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(10000, TimeUnit.MILLISECONDS); assertTrue(ok); } handlers.clear(); // New handlers for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (ClientSession session : sessions) { session.rollback(); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(10000, TimeUnit.MILLISECONDS); assertTrue(ok); } for (ClientSession session : sessions) { session.commit(); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestD(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + " sub" + i); ClientSession sessConsume = sf.createSession(false, false, false, false); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.rollback(); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.commit(); for (ClientSession session : sessions) { session.start(); } class MyHandler implements MessageHandler { final CountDownLatch latch = new CountDownLatch(1); volatile int count; public void onMessage(ClientMessage message) { try { message.acknowledge(); } catch (MessagingException me) { log.error("Failed to process", me); } if (count >= numMessages) { return; } count++; if (count == numMessages) { latch.countDown(); } } } Set<MyHandler> handlers = new HashSet<MyHandler>(); for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(10000, TimeUnit.MILLISECONDS); assertTrue(ok); } handlers.clear(); // New handlers for (ClientConsumer consumer : consumers) { MyHandler handler = new MyHandler(); consumer.setMessageHandler(handler); handlers.add(handler); } for (ClientSession session : sessions) { session.rollback(); } for (MyHandler handler : handlers) { boolean ok = handler.latch.await(10000, TimeUnit.MILLISECONDS); assertTrue(ok); } for (ClientSession session : sessions) { session.commit(); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + " sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } // Now with synchronous receive() protected void doTestE(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, true, true, false); sessConsume.start(); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(msg); msg.acknowledge(); } } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestF(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, true, true, false); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, true, true, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } for (ClientSession session : sessions) { session.start(); } for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(msg); msg.acknowledge(); } } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestG(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, false, false, false); sessConsume.start(); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, false, false, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.rollback(); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.commit(); for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(msg); msg.acknowledge(); } } for (ClientSession session : sessions) { session.rollback(); } for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(msg); msg.acknowledge(); } } for (ClientSession session : sessions) { session.commit(); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestH(final ClientSessionFactory sf, final int threadNum) throws Exception { long start = System.currentTimeMillis(); ClientSession s = sf.createSession(false, false, false, false); final int numMessages = 100; final int numSessions = 10; Set<ClientConsumer> consumers = new HashSet<ClientConsumer>(); Set<ClientSession> sessions = new HashSet<ClientSession>(); for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); ClientSession sessConsume = sf.createSession(false, false, false, false); sessConsume.createQueue(ADDRESS, subName, null, false, false); ClientConsumer consumer = sessConsume.createConsumer(subName); consumers.add(consumer); sessions.add(sessConsume); } ClientSession sessSend = sf.createSession(false, false, false, false); ClientProducer producer = sessSend.createProducer(ADDRESS); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.rollback(); for (int i = 0; i < numMessages; i++) { ClientMessage message = sessSend.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.putIntProperty(new SimpleString("count"), i); message.getBody().flip(); producer.send(message); } sessSend.commit(); for (ClientSession session : sessions) { session.start(); } for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); msg.acknowledge(); } } for (ClientSession session : sessions) { session.rollback(); } for (int i = 0; i < numMessages; i++) { for (ClientConsumer consumer : consumers) { ClientMessage msg = consumer.receive(RECEIVE_TIMEOUT); msg.acknowledge(); } } for (ClientSession session : sessions) { session.commit(); } sessSend.close(); for (ClientSession session : sessions) { session.close(); } for (int i = 0; i < numSessions; i++) { SimpleString subName = new SimpleString(threadNum + "sub" + i); s.deleteQueue(subName); } s.close(); long end = System.currentTimeMillis(); log.info("duration " + (end - start)); } protected void doTestI(final ClientSessionFactory sf, final int threadNum) throws Exception { ClientSession sessCreate = sf.createSession(false, true, true, false); sessCreate.createQueue(ADDRESS, new SimpleString(threadNum + ADDRESS.toString()), null, false, false); ClientSession sess = sf.createSession(false, true, true, false); sess.start(); ClientConsumer consumer = sess.createConsumer(new SimpleString(threadNum + ADDRESS.toString())); ClientProducer producer = sess.createProducer(ADDRESS); ClientMessage message = sess.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.getBody().flip(); producer.send(message); ClientMessage message2 = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(message2); message2.acknowledge(); sess.close(); sessCreate.deleteQueue(new SimpleString(threadNum + ADDRESS.toString())); sessCreate.close(); } protected void doTestJ(final ClientSessionFactory sf, final int threadNum) throws Exception { ClientSession sessCreate = sf.createSession(false, true, true, false); sessCreate.createQueue(ADDRESS, new SimpleString(threadNum + ADDRESS.toString()), null, false, false); ClientSession sess = sf.createSession(false, true, true, false); sess.start(); ClientConsumer consumer = sess.createConsumer(new SimpleString(threadNum + ADDRESS.toString())); ClientProducer producer = sess.createProducer(ADDRESS); ClientMessage message = sess.createClientMessage(JBossTextMessage.TYPE, false, 0, System.currentTimeMillis(), (byte)1); message.getBody().flip(); producer.send(message); ClientMessage message2 = consumer.receive(RECEIVE_TIMEOUT); assertNotNull(message2); message2.acknowledge(); sess.close(); sessCreate.deleteQueue(new SimpleString(threadNum + ADDRESS.toString())); sessCreate.close(); } protected void doTestK(final ClientSessionFactory sf, final int threadNum) throws Exception { ClientSession s = sf.createSession(false, false, false, false); s.createQueue(ADDRESS, new SimpleString(threadNum + ADDRESS.toString()), null, false, false); final int numConsumers = 100; for (int i = 0; i < numConsumers; i++) { ClientConsumer consumer = s.createConsumer(new SimpleString(threadNum + ADDRESS.toString())); consumer.close(); } s.deleteQueue(new SimpleString(threadNum + ADDRESS.toString())); s.close(); } protected void doTestL(final ClientSessionFactory sf) throws Exception { ClientSession s = sf.createSession(false, false, false, false); final int numSessions = 100; for (int i = 0; i < numSessions; i++) { ClientSession session = sf.createSession(false, false, false, false); session.close(); } s.close(); } protected int getNumIterations() { return 5; } protected void setUp() throws Exception { super.setUp(); log.info("************ Starting test " + this.getName()); timer = new Timer(); } protected void tearDown() throws Exception { log.info("************* Ending test " + this.getName()); timer.cancel(); super.tearDown(); } // Private ------------------------------------------------------- private void runTestMultipleThreads(final RunnableT runnable, final int numThreads) throws Exception { final int numIts = getNumIterations(); for (int its = 0; its < numIts; its++) { log.info("************ ITERATION: " + its); start(); final ClientSessionFactoryImpl sf = new ClientSessionFactoryImpl(new TransportConfiguration("org.jboss.messaging.core.remoting.impl.invm.InVMConnectorFactory"), new TransportConfiguration("org.jboss.messaging.core.remoting.impl.invm.InVMConnectorFactory", backupParams)); ClientSession session = sf.createSession(false, false, false, false); Failer failer = startFailer(1000, session); class Runner extends Thread { private volatile Throwable throwable; private final RunnableT test; private final int threadNum; Runner(final RunnableT test, final int threadNum) { this.test = test; this.threadNum = threadNum; } public void run() { try { test.run(sf, threadNum); } catch (Throwable t) { throwable = t; log.error("Failed to run test", t); } } } do { List<Runner> threads = new ArrayList<Runner>(); for (int i = 0; i < numThreads; i++) { Runner runner = new Runner(runnable, i); threads.add(runner); runner.start(); } for (Runner thread : threads) { thread.join(); assertNull(thread.throwable); } runnable.checkFail(); } while (!failer.isExecuted()); session.close(); assertEquals(0, sf.getSessionCount()); stop(); } } private Failer startFailer(final long time, final ClientSession session) { Failer failer = new Failer(session); timer.schedule(failer, (long)(time * Math.random()), 100); return failer; } private void start() throws Exception { Configuration backupConf = new ConfigurationImpl(); backupConf.setSecurityEnabled(false); backupConf.setPacketConfirmationBatchSize(10); backupParams.put(TransportConstants.SERVER_ID_PROP_NAME, 1); backupConf.getAcceptorConfigurations() .add(new TransportConfiguration("org.jboss.messaging.core.remoting.impl.invm.InVMAcceptorFactory", backupParams)); backupConf.setBackup(true); backupService = MessagingServiceImpl.newNullStorageMessagingServer(backupConf); backupService.start(); // We need to sleep > 16 ms otherwise the id generators on live and backup could be initialised // with the same time component Thread.sleep(17); Configuration liveConf = new ConfigurationImpl(); liveConf.setSecurityEnabled(false); liveConf.setPacketConfirmationBatchSize(10); liveConf.getAcceptorConfigurations() .add(new TransportConfiguration("org.jboss.messaging.core.remoting.impl.invm.InVMAcceptorFactory")); liveConf.setBackupConnectorConfiguration(new TransportConfiguration("org.jboss.messaging.core.remoting.impl.invm.InVMConnectorFactory", backupParams)); liveService = MessagingServiceImpl.newNullStorageMessagingServer(liveConf); liveService.start(); } private void stop() throws Exception { ConnectionRegistryImpl.instance.dump(); assertEquals(0, ConnectionRegistryImpl.instance.size()); // ConnectionRegistryImpl.instance.clear(); assertEquals(0, backupService.getServer().getRemotingService().getConnections().size()); backupService.stop(); assertEquals(0, liveService.getServer().getRemotingService().getConnections().size()); liveService.stop(); assertEquals(0, InVMRegistry.instance.size()); } // Inner classes ------------------------------------------------- class Failer extends TimerTask { private final ClientSession session; private boolean executed; public Failer(final ClientSession session) { this.session = session; } public synchronized void run() { log.info("** Failing connection"); RemotingConnectionImpl conn = (RemotingConnectionImpl)((ClientSessionImpl)session).getConnection(); conn.fail(new MessagingException(MessagingException.NOT_CONNECTED, "blah")); log.info("** Fail complete"); cancel(); executed = true; } public synchronized boolean isExecuted() { return executed; } } public abstract class RunnableT extends Thread { private volatile String failReason; private volatile Throwable throwable; public void setFailed(final String reason, final Throwable throwable) { this.failReason = reason; this.throwable = throwable; } public void checkFail() { if (throwable != null) { log.error("Test failed: " + failReason, throwable); } if (failReason != null) { fail(failReason); } } public abstract void run(final ClientSessionFactory sf, final int threadNum) throws Exception; } }