/* * 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.jms.cluster; import javax.jms.Connection; import javax.jms.Session; import java.util.concurrent.CountDownLatch; import org.apache.activemq.artemis.api.core.TransportConfiguration; import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; import org.apache.activemq.artemis.api.jms.JMSFactoryType; import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory; import org.apache.activemq.artemis.tests.util.JMSClusteredTestBase; import org.junit.Test; public class MultipleThreadsOpeningTest extends JMSClusteredTestBase { /** * created for https://issues.apache.org/jira/browse/ARTEMIS-385 */ @Test public void testRepetitions() throws Exception { // This test was eventually failing with way over more iterations. // you might increase it for debugging final int ITERATIONS = 50; for (int i = 0; i < ITERATIONS; i++) { System.out.println("#test " + i); internalMultipleOpen(200, 1); tearDown(); setUp(); } } @Test public void testMultipleOpen() throws Exception { internalMultipleOpen(20, 500); } protected void internalMultipleOpen(final int numberOfThreads, final int numberOfOpens) throws Exception { cf1 = ActiveMQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, new TransportConfiguration(InVMConnectorFactory.class.getName(), generateInVMParams(1))); // I want all the threads aligned, just ready to start creating connections like in a car race final CountDownLatch flagAlignSemaphore = new CountDownLatch(numberOfThreads); final CountDownLatch flagStartRace = new CountDownLatch(1); class ThreadOpen extends Thread { ThreadOpen(int i) { super("MultipleThreadsOpeningTest/ThreadOpen::" + i); } int errors = 0; @Override public void run() { try { flagAlignSemaphore.countDown(); flagStartRace.await(); for (int i = 0; i < numberOfOpens; i++) { if (i > 0 && i % 100 == 0) System.out.println("connections created on Thread " + Thread.currentThread() + " " + i); Connection conn = cf1.createConnection(); Session sess = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); sess.close(); conn.close(); } } catch (Exception e) { e.printStackTrace(); errors++; } } } ThreadOpen[] threads = new ThreadOpen[numberOfThreads]; for (int i = 0; i < numberOfThreads; i++) { threads[i] = new ThreadOpen(i); threads[i].start(); } flagAlignSemaphore.await(); flagStartRace.countDown(); try { for (ThreadOpen t : threads) { t.join(60000); assertFalse(t.isAlive()); assertEquals("There are Errors on the test thread", 0, t.errors); } } finally { for (ThreadOpen t : threads) { if (t.isAlive()) { t.interrupt(); } t.join(1000); } } } }