diff --git a/activemq-amqp/pom.xml b/activemq-amqp/pom.xml
index 9e54c0bb232..639adbce52b 100644
--- a/activemq-amqp/pom.xml
+++ b/activemq-amqp/pom.xml
@@ -180,6 +180,80 @@
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.version}
+
+ ${surefire.argLine}
+ alphabetical
+ plain
+ false
+ org.apache.activemq.transport.amqp.ParallelTest
+
+ ${project.build.directory}/
+
+
+ true
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+ **/*Test.*
+
+
+ **/*LoadTest.java
+ **/*StressTest.java
+
+
+
+
+ parallel
+ test
+
+ test
+
+
+
+
+ org.apache.activemq.transport.amqp.ParallelTest
+ 2C
+ false
+ 600
+ false
+
+ ${project.build.directory}/parallel-tests-${surefire.forkNumber}/
+
+ 30000
+
+
+
+
+
+
+ org.apache.maven.surefire
+ surefire-junit47
+ ${surefire.version}
+
+
+ me.fabriciorby
+ maven-surefire-junit5-tree-reporter
+ 1.5.1
+
+
+
+
+
+
+
+ org.apache.activemq.store.kahadb.ParallelTest
+ 2C
+ false
+ 600
+ false
+
+ ${project.build.directory}/parallel-tests-${surefire.forkNumber}/
+
+ 30000
+
+
+
+
+
+
+ org.apache.maven.surefire
+ surefire-junit47
+ ${surefire.version}
+
+
+ me.fabriciorby
+ maven-surefire-junit5-tree-reporter
+ 1.5.1
+
+
+
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/JournalCorruptionIndexRecoveryTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/JournalCorruptionIndexRecoveryTest.java
index 1dc84afec1e..0a4d4fcb5c4 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/JournalCorruptionIndexRecoveryTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/JournalCorruptionIndexRecoveryTest.java
@@ -42,17 +42,19 @@
import org.apache.activemq.util.RecoverableRandomAccessFile;
import org.junit.After;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
+@Category(ParallelTest.class)
@RunWith(Parameterized.class)
public class JournalCorruptionIndexRecoveryTest {
private static final Logger LOG = LoggerFactory.getLogger(JournalCorruptionIndexRecoveryTest.class);
- private final String KAHADB_DIRECTORY = "target/activemq-data/";
private final String payload = new String(new byte[1024]);
private ActiveMQConnectionFactory cf = null;
@@ -92,7 +94,6 @@ private void doStartBroker(boolean delete) throws Exception {
broker.setDeleteAllMessagesOnStartup(delete);
broker.setPersistent(true);
broker.setUseJmx(true);
- broker.setDataDirectory(KAHADB_DIRECTORY);
broker.addConnector("tcp://localhost:0");
configurePersistence(broker);
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/ParallelTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/ParallelTest.java
new file mode 100644
index 00000000000..3ce04968372
--- /dev/null
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/ParallelTest.java
@@ -0,0 +1,27 @@
+/**
+ * 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.store.kahadb;
+
+
+/**
+ * Marker interface used with {@code @Category(ParallelTest.class)} to opt a
+ * test class or method into the {@code all-parallel} Maven profile. Only tests
+ * explicitly tagged with this category execute when the profile is enabled,
+ * which allows a gradual migration toward full parallelism.
+ */
+public interface ParallelTest {
+}
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java
index cd2947108f6..0b1d325aa44 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java
@@ -32,15 +32,18 @@
import java.util.Map;
import java.util.Random;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.page.PageFile;
import org.apache.activemq.store.kahadb.disk.page.Transaction;
import org.apache.activemq.store.kahadb.disk.util.LongMarshaller;
import org.apache.activemq.store.kahadb.disk.util.StringMarshaller;
import org.apache.activemq.store.kahadb.disk.util.VariableMarshaller;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@Category(ParallelTest.class)
public class BTreeIndexTest extends IndexTestSupport {
private static final Logger LOG = LoggerFactory.getLogger(BTreeIndexTest.class);
private NumberFormat nf;
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java
index d4b5e4580c1..2d35ddf4796 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java
@@ -16,9 +16,12 @@
*/
package org.apache.activemq.store.kahadb.disk.index;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.util.LongMarshaller;
import org.apache.activemq.store.kahadb.disk.util.StringMarshaller;
+import org.junit.experimental.categories.Category;
+@Category(ParallelTest.class)
public class HashIndexTest extends IndexTestSupport {
@Override
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java
index 112ca1ead6c..986f493a907 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java
@@ -31,6 +31,7 @@
import java.util.Map;
import java.util.Random;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.page.PageFile;
import org.apache.activemq.store.kahadb.disk.util.LongMarshaller;
import org.apache.activemq.store.kahadb.disk.util.Sequence;
@@ -38,9 +39,11 @@
import org.apache.activemq.store.kahadb.disk.util.StringMarshaller;
import org.apache.activemq.store.kahadb.disk.util.VariableMarshaller;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@Category(ParallelTest.class)
public class ListIndexTest extends IndexTestSupport {
private static final Logger LOG = LoggerFactory.getLogger(ListIndexTest.class);
private NumberFormat nf;
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/PageFileTransactionAsyncTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/PageFileTransactionAsyncTest.java
index 97509ae6872..684076a6a55 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/PageFileTransactionAsyncTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/PageFileTransactionAsyncTest.java
@@ -16,15 +16,18 @@
*/
package org.apache.activemq.store.kahadb.disk.index;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.page.PageFile;
import org.apache.activemq.store.kahadb.disk.page.Transaction;
import org.apache.activemq.store.kahadb.disk.util.LongMarshaller;
import org.apache.activemq.store.kahadb.disk.util.StringMarshaller;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import java.io.File;
import java.util.LinkedList;
+@Category(ParallelTest.class)
public class PageFileTransactionAsyncTest {
@Test(timeout=60000)
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorPoolTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorPoolTest.java
index 2d33265b8cb..2b5641f885c 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorPoolTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorPoolTest.java
@@ -23,10 +23,13 @@
import java.io.File;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
+@Category(ParallelTest.class)
public class DataFileAccessorPoolTest {
@Rule
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorTest.java
index b5fe52a0dd6..a9a0030e214 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessorTest.java
@@ -24,11 +24,15 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
+
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
+@Category(ParallelTest.class)
public class DataFileAccessorTest {
@Rule
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAppenderSyncStrategyTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAppenderSyncStrategyTest.java
index 494e256bd11..491c37e4dc3 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAppenderSyncStrategyTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAppenderSyncStrategyTest.java
@@ -23,13 +23,16 @@
import java.util.concurrent.TimeUnit;
import org.apache.activemq.store.kahadb.KahaDBStore;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.journal.Journal.JournalDiskSyncStrategy;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.Timeout;
+@Category(ParallelTest.class)
public class DataFileAppenderSyncStrategyTest {
@Rule
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/JournalMaxFileLengthChangeTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/JournalMaxFileLengthChangeTest.java
index b28f1e39d6a..9a8e3bf43aa 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/JournalMaxFileLengthChangeTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/JournalMaxFileLengthChangeTest.java
@@ -28,14 +28,17 @@
import org.apache.activemq.command.MessageId;
import org.apache.activemq.store.MessageStore;
import org.apache.activemq.store.kahadb.KahaDBStore;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.Timeout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@Category(ParallelTest.class)
public class JournalMaxFileLengthChangeTest {
private static final Logger LOG = LoggerFactory.getLogger(JournalMaxFileLengthChangeTest.class);
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/TargetedDataFileAppenderTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/TargetedDataFileAppenderTest.java
index bbdcde7600d..40291c33bd6 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/TargetedDataFileAppenderTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/journal/TargetedDataFileAppenderTest.java
@@ -23,15 +23,18 @@
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.util.ByteSequence;
import org.apache.activemq.util.IOHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
/**
* Test the single threaded DataFileAppender class.
*/
+@Category(ParallelTest.class)
public class TargetedDataFileAppenderTest {
private Journal dataManager;
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java
index 7e8278f5c94..3521d4cabb6 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java
@@ -17,6 +17,7 @@
package org.apache.activemq.store.kahadb.disk.page;
import junit.framework.TestCase;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.util.StringMarshaller;
import org.apache.activemq.util.Wait;
import org.apache.logging.log4j.Level;
@@ -26,6 +27,7 @@
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.core.layout.MessageLayout;
+import org.junit.experimental.categories.Category;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,6 +43,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
@SuppressWarnings("rawtypes")
+@Category(ParallelTest.class)
public class PageFileTest extends TestCase {
private static final Logger LOG = LoggerFactory.getLogger(PageFileTest.class);
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/TransactionTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/TransactionTest.java
index 900f8e209e0..f78c8aa41ce 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/TransactionTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/TransactionTest.java
@@ -18,7 +18,9 @@
*/
import junit.framework.TestCase;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.store.kahadb.disk.util.Marshaller;
+import org.junit.experimental.categories.Category;
import java.io.DataInput;
import java.io.DataOutput;
@@ -27,6 +29,7 @@
import java.util.ArrayList;
import java.util.List;
+@Category(ParallelTest.class)
public class TransactionTest extends TestCase {
private static long NUMBER_OF_BYTES = 10485760L;
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java
index 7df83513f50..6c879dbd8f4 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java
@@ -21,8 +21,11 @@
import java.util.Iterator;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
+@Category(ParallelTest.class)
public class SequenceSetTest {
@Test
diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/plist/PListImplTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/plist/PListImplTest.java
index ba702b71fef..502f57aa6b7 100644
--- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/plist/PListImplTest.java
+++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/plist/PListImplTest.java
@@ -25,13 +25,16 @@
import org.apache.activemq.store.PListStore;
import org.apache.activemq.store.PListTestSupport;
+import org.apache.activemq.store.kahadb.ParallelTest;
import org.apache.activemq.util.IOHelper;
import org.junit.Ignore;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
/**
* @author Hiram Chirino
*/
+@Category(ParallelTest.class)
public class PListImplTest extends PListTestSupport {
diff --git a/pom.xml b/pom.xml
index 028cf65864c..5dd3c4a0bed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -127,6 +127,7 @@
3.9.0
1.45
3.8.6
+ 3.5.3
*
org.apache.activemq*