Update JMS Server to match updated Appender. Move some classes ActiveMQ
JUnit test rule in this module from the Core module. This is to avoid a
dependency cycle.
diff --git a/log4j-server/pom.xml b/log4j-server/pom.xml
index 29de565..36098e0 100644
--- a/log4j-server/pom.xml
+++ b/log4j-server/pom.xml
@@ -93,6 +93,11 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.activemq</groupId>
+      <artifactId>activemq-broker</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java
index 70477db..a6cf9cc 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java
@@ -24,6 +24,7 @@
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
+
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
@@ -35,6 +36,7 @@
 import org.apache.logging.log4j.core.LifeCycle2;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LogEventListener;
+import org.apache.logging.log4j.core.appender.mom.JmsAppender;
 import org.apache.logging.log4j.core.appender.mom.JmsManager;
 import org.apache.logging.log4j.core.net.JndiManager;
 
@@ -49,14 +51,14 @@
     private final JmsManager jmsManager;
     private MessageConsumer messageConsumer;
 
-    public JmsServer(final String connectionFactoryBindingName,
-                     final String destinationBindingName,
-                     final String username,
-                     final String password) {
+    public JmsServer(final String connectionFactoryBindingName, final String connectionFactoryName,
+            final String providerURL, final String destinationBindingName, final String username, final char[] password,
+            final Properties jndiProperties) {
         final String managerName = JmsServer.class.getName() + '@' + JmsServer.class.hashCode();
-        // TODO init JmsManager properly
-        jmsManager = JmsManager.getJmsManager(managerName, jndiManager, connectionFactoryBindingName,
-            destinationBindingName, username, password.toCharArray(), false, 0L);
+        final Properties jndiManager = JndiManager.createProperties(connectionFactoryBindingName, providerURL, null,
+                null, null, jndiProperties);
+        jmsManager = JmsManager.getJmsManager(managerName, jndiManager, connectionFactoryName, destinationBindingName,
+                username, password, false, JmsAppender.Builder.DEFAULT_RECONNECT_INTERVAL_MILLIS);
     }
 
     @Override
@@ -76,7 +78,7 @@
                 }
             } else {
                 LOGGER.warn("Received message of type {} and JMSType {} which cannot be handled.", message.getClass(),
-                    message.getJMSType());
+                        message.getJMSType());
             }
         } catch (final JMSException e) {
             LOGGER.catching(e);
@@ -130,10 +132,8 @@
      * Starts and runs this server until the user types "exit" into standard input.
      *
      * @throws IOException
-     * @since 2.6
      */
-    public void run() throws IOException {
-        this.start();
+    public void commandLineLoop() throws IOException {
         System.out.println("Type \"exit\" to quit.");
         final BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in, Charset.defaultCharset()));
         while (true) {
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
index a19f217..db66653 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
@@ -182,7 +182,7 @@
     @Override
     public void shutdown() {
         this.setActive(false);
-        Thread.currentThread().interrupt();
+        //Thread.currentThread().interrupt();
         datagramSocket.close();
     }
 }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java
index 373d31c..9103d69 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java
@@ -17,6 +17,8 @@
 
 package org.apache.logging.log4j.server.mom.jms;
 
+import java.util.Properties;
+
 import org.apache.logging.log4j.server.JmsServer;
 
 /**
@@ -26,6 +28,10 @@
  */
 public abstract class AbstractJmsReceiver {
 
+    class CommandLineArgs {
+
+    }
+
     /**
      * Prints out usage information to {@linkplain System#err standard error}.
      */
@@ -33,16 +39,31 @@
 
     /**
      * Executes a JmsServer with the given command line arguments.
+     * 
+     * @param interactive
+     *            Whether or not this is an interactive application by providing a command line and exit on error.
+     * @param args
+     *            command line arguments
      *
-     * @param args command line arguments
      * @throws Exception
      */
-    protected void doMain(final String... args) throws Exception {
-        if (args.length != 4) {
+    protected void doMain(boolean interactive, final String... args) throws Exception {
+        // TODO Too many args, Use JCommander
+        if (args.length < 5) {
             usage();
-            System.exit(1);
+            if (interactive) {
+                System.exit(1);
+            }
         }
-        final JmsServer server = new JmsServer(args[0], args[1], args[2], args[3]);
-        server.run();
+        final Properties properties = new Properties();
+        for (int index = 5; index < args.length; index += 2) {
+            properties.put(args[index], args[index + 1]);
+        }
+        final JmsServer server = new JmsServer(args[0], "ConnectionFactory", args[1], args[2], args[3],
+                args[4].toCharArray(), properties);
+        server.start();
+        if (interactive) {
+            server.commandLineLoop();
+        }
     }
 }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java
index a7f75ec..f7cadc8 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java
@@ -23,7 +23,8 @@
  */
 public class JmsQueueReceiver extends AbstractJmsReceiver {
 
-    private JmsQueueReceiver() {
+    JmsQueueReceiver() {
+        // Usage is to call main()
     }
 
     /**
@@ -33,14 +34,13 @@
      * @throws Exception if an error occurs.
      */
     public static void main(final String[] args) throws Exception {
-        final JmsQueueReceiver receiver = new JmsQueueReceiver();
-        receiver.doMain(args);
+        new JmsQueueReceiver().doMain(true, args);
     }
 
     @Override
     protected void usage() {
         System.err.println("Wrong number of arguments.");
         System.err.println("Usage: java " + JmsQueueReceiver.class.getName()
-            + " QueueConnectionFactoryBindingName QueueBindingName username password");
+            + " QueueConnectionFactoryBindingName QueueBindingName username password [jndiPropertyKey jndiPropertyValue]*");
     }
 }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java
index 21828d7..8e50cdf 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java
@@ -24,6 +24,7 @@
 public class JmsTopicReceiver extends AbstractJmsReceiver {
 
     private JmsTopicReceiver() {
+        // Usage is to call main()
     }
 
     /**
@@ -33,14 +34,13 @@
      * @throws Exception if an error occurs.
      */
     public static void main(final String[] args) throws Exception {
-        final JmsTopicReceiver receiver = new JmsTopicReceiver();
-        receiver.doMain(args);
+        new JmsTopicReceiver().doMain(true, args);
     }
 
     @Override
     protected void usage() {
         System.err.println("Wrong number of arguments.");
         System.err.println("Usage: java " + JmsTopicReceiver.class.getName()
-            + " TopicConnectionFactoryBindingName TopicBindingName username password");
+            + " TopicConnectionFactoryBindingName TopicBindingName username password [jndiPropertyKey jndiPropertyValue]*");
     }
 }
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java
new file mode 100644
index 0000000..e1fb522
--- /dev/null
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java
@@ -0,0 +1,51 @@
+/*
+ * 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.logging.log4j.server.mom.activemq;
+
+import java.io.IOException;
+
+import org.apache.activemq.broker.BrokerService;
+
+/**
+ * Helps starts an embedded Apache ActiveMQ service broker.
+ */
+public class ActiveMqBrokerServiceHelper {
+
+    public static BrokerService startBrokerService(final String brokerName, String brokerUrlString, final int port)
+            throws Exception {
+        // TODO Abstract out scheme
+        brokerUrlString = "tcp://localhost:" + port;
+        final BrokerService broker = new BrokerService();
+        // configure the Broker
+        broker.setBrokerName(brokerName);
+        broker.addConnector(brokerUrlString);
+        broker.setPersistent(false);
+        broker.start();
+        broker.waitUntilStarted();
+        return broker;
+    }
+
+    public static void stopBrokerService(final BrokerService brokerService) throws IOException, Exception {
+        if (brokerService != null) {
+            brokerService.deleteAllMessages();
+            brokerService.stop();
+            brokerService.waitUntilStopped();
+        }
+    }
+
+}
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java
new file mode 100644
index 0000000..a3116ac
--- /dev/null
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java
@@ -0,0 +1,94 @@
+/*
+ * 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.logging.log4j.server.mom.activemq;
+
+import org.apache.activemq.broker.BrokerService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.TestMarkers;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * JUnit {@link TestRule} to manage an in-JVM Apache ActiveMQ broker with socket
+ * communications between clients and broker.
+ */
+public class ActiveMqBrokerServiceRule implements TestRule {
+
+	static final Logger logger = LogManager.getLogger(ActiveMqBrokerServiceRule.class);
+
+	/**
+	 * Apache Active MQ uses this property name to lookup which port to use to
+	 * connect to a broker.
+	 */
+	public static final String PORT_PROPERTY_NAME = "org.apache.activemq.AMQ_PORT";
+
+	private final String brokerName;
+
+	private String brokerUrlString;
+
+	private final String portPropertyName;
+
+	public ActiveMqBrokerServiceRule(final String brokerName, final String portPropertyName) {
+		this.brokerName = brokerName;
+		this.portPropertyName = portPropertyName;
+	}
+
+	@Override
+	public Statement apply(final Statement base, final Description description) {
+		return new Statement() {
+
+			@Override
+			public void evaluate() throws Throwable {
+				final BrokerService broker = ActiveMqBrokerServiceHelper.startBrokerService(brokerName, brokerUrlString,
+						Integer.parseInt(System.getProperty(portPropertyName)));
+				logger.debug(TestMarkers.TEST_RULE_LIFE_CYCLE, "{} started Apache Active MQ {}",
+						this.getClass().getSimpleName(), this);
+				try {
+					base.evaluate();
+				} finally {
+					ActiveMqBrokerServiceHelper.stopBrokerService(broker);
+					logger.debug(TestMarkers.TEST_RULE_LIFE_CYCLE, "{} stopped Apache Active MQ {}",
+							this.getClass().getSimpleName(), this);
+				}
+			}
+
+		};
+	}
+
+	public String getBrokerName() {
+		return brokerName;
+	}
+
+	public String getBrokerUrlString() {
+		return brokerUrlString;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuilder builder = new StringBuilder();
+		builder.append("ActiveMqBrokerServiceRule [brokerName=");
+		builder.append(brokerName);
+		builder.append(", bindAddress=");
+		builder.append(brokerUrlString);
+		builder.append("]");
+		return builder.toString();
+	}
+
+}
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java
new file mode 100644
index 0000000..891a4e0
--- /dev/null
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.logging.log4j.server.mom.jms;
+
+import org.apache.logging.log4j.server.mom.activemq.ActiveMqBrokerServiceRule;
+import org.apache.logging.log4j.test.AvailablePortSystemPropertyRule;
+import org.apache.logging.log4j.test.RuleChainFactory;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+
+public class JmsQueueReceiverTest {
+
+    private static final AvailablePortSystemPropertyRule portRule = AvailablePortSystemPropertyRule
+            .create(ActiveMqBrokerServiceRule.PORT_PROPERTY_NAME);
+
+    private static final ActiveMqBrokerServiceRule activeMqBrokerServiceRule = new ActiveMqBrokerServiceRule(
+            JmsQueueReceiverTest.class.getName(), portRule.getName());
+
+    @ClassRule
+    public static RuleChain ruleChain = RuleChainFactory.create(portRule, activeMqBrokerServiceRule);
+
+    @Test
+    public void testMain() throws Exception {
+        new JmsQueueReceiver().doMain(false, new String[] { "org.apache.activemq.jndi.ActiveMQInitialContextFactory",
+                "tcp://localhost:" + portRule.getPort(), "testq", "admin", "admin", "queue.testq", "testq" });
+    }
+}
diff --git a/pom.xml b/pom.xml
index 4672795..d28a3c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -200,7 +200,8 @@
     <projectDir />
     <commonsLoggingVersion>1.2</commonsLoggingVersion>
     <osgi.api.version>4.3.1</osgi.api.version>
-    <activemq.version>5.14.4</activemq.version>
+    <!-- Version 5.15.0 requires Java 8 -->
+    <activemq.version>5.14.5</activemq.version>
     <!-- Allow Clirr severity to be overriden by the command-line option -DminSeverity=level -->
     <minSeverity>info</minSeverity>
     <jctoolsVersion>1.2.1</jctoolsVersion>
@@ -263,6 +264,18 @@
         <scope>provided</scope>
       </dependency>
       <dependency>
+        <groupId>org.apache.activemq</groupId>
+        <artifactId>activemq-broker</artifactId>
+        <version>${activemq.version}</version>
+        <scope>test</scope>
+        <exclusions>
+          <exclusion>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jms_1.1_spec</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>