Add BlockingQueueFactory and implementations

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b8c9501c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b8c9501c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b8c9501c

Branch: refs/heads/master
Commit: b8c9501cf82a35df2ecc2fff44415c5b83388ea6
Parents: 6d4c455
Author: Matt Sicker <boa...@gmail.com>
Authored: Wed Jun 15 14:11:47 2016 -0500
Committer: Matt Sicker <boa...@gmail.com>
Committed: Wed Jun 15 14:11:47 2016 -0500

----------------------------------------------------------------------
 .../core/util/ArrayBlockingQueueFactory.java    | 16 ++++++
 .../log4j/core/util/BlockingQueueFactory.java   | 12 +++++
 .../core/util/BlockingQueueFactoryUtil.java     | 56 ++++++++++++++++++++
 .../util/DisruptorBlockingQueueFactory.java     | 17 ++++++
 4 files changed, 101 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b8c9501c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ArrayBlockingQueueFactory.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ArrayBlockingQueueFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ArrayBlockingQueueFactory.java
new file mode 100644
index 0000000..c669b84
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ArrayBlockingQueueFactory.java
@@ -0,0 +1,16 @@
+package org.apache.logging.log4j.core.util;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+
+/**
+ * Factory for creating instances of {@link ArrayBlockingQueue}.
+ *
+ * @since 2.7
+ */
+public class ArrayBlockingQueueFactory<E> implements BlockingQueueFactory<E> {
+    @Override
+    public BlockingQueue<E> create(int capacity) {
+        return new ArrayBlockingQueue<>(capacity);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b8c9501c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactory.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactory.java
new file mode 100644
index 0000000..9251799
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactory.java
@@ -0,0 +1,12 @@
+package org.apache.logging.log4j.core.util;
+
+import java.util.concurrent.BlockingQueue;
+
+/**
+ * Factory for creating instances of {@link BlockingQueue}.
+ *
+ * @since 2.7
+ */
+public interface BlockingQueueFactory<E> {
+    BlockingQueue<E> create(int capacity);
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b8c9501c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactoryUtil.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactoryUtil.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactoryUtil.java
new file mode 100644
index 0000000..7818157
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BlockingQueueFactoryUtil.java
@@ -0,0 +1,56 @@
+package org.apache.logging.log4j.core.util;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
+
+/**
+ * Utility class for obtaining a {@link BlockingQueueFactory}. If the 
Conversant Disruptor library is available, then
+ * {@link DisruptorBlockingQueueFactory} will be used; otherwise, {@link 
ArrayBlockingQueueFactory} will be used.
+ *
+ * @since 2.7
+ */
+public final class BlockingQueueFactoryUtil {
+
+    private static final Logger LOGGER = StatusLogger.getLogger();
+    private static final BlockingQueueFactory<LogEvent> 
LOG_EVENT_BLOCKING_QUEUE_FACTORY;
+
+    static {
+        BlockingQueueFactory<LogEvent> factory = null;
+        if 
(LoaderUtil.isClassAvailable("com.conversantmedia.util.concurrent.DisruptorBlockingQueue"))
 {
+            try {
+                factory = newDisruptorBlockingQueueFactory();
+            } catch (final ClassNotFoundException | NoSuchMethodException | 
InstantiationException | IllegalAccessException | InvocationTargetException e) {
+                LOGGER.warn("Found Conversant Disruptor, but an error is 
preventing use of it." +
+                    " Falling back to default ArrayBlockingQueue 
implementation.", e);
+            }
+        }
+        if (factory == null) {
+            factory = new ArrayBlockingQueueFactory<>();
+        }
+        LOG_EVENT_BLOCKING_QUEUE_FACTORY = factory;
+    }
+
+    @SuppressWarnings("unchecked")
+    private static BlockingQueueFactory<LogEvent> 
newDisruptorBlockingQueueFactory()
+        throws ClassNotFoundException, NoSuchMethodException, 
InstantiationException, IllegalAccessException,
+        InvocationTargetException {
+        return 
LoaderUtil.newCheckedInstanceOf("org.apache.logging.log4j.core.util.DisruptorBlockingQueueFactory",
+            BlockingQueueFactory.class);
+    }
+
+    /**
+     * Returns a suitable BlockingQueueFactory for LogEvents.
+     *
+     * @return a BlockingQueueFactory instance
+     */
+    public static BlockingQueueFactory<LogEvent> 
getLogEventBlockingQueueFactory() {
+        return LOG_EVENT_BLOCKING_QUEUE_FACTORY;
+    }
+
+    private BlockingQueueFactoryUtil() {
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b8c9501c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/DisruptorBlockingQueueFactory.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/DisruptorBlockingQueueFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/DisruptorBlockingQueueFactory.java
new file mode 100644
index 0000000..3f80816
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/DisruptorBlockingQueueFactory.java
@@ -0,0 +1,17 @@
+package org.apache.logging.log4j.core.util;
+
+import java.util.concurrent.BlockingQueue;
+
+import com.conversantmedia.util.concurrent.DisruptorBlockingQueue;
+
+/**
+ * Factory for creating instances of {@link DisruptorBlockingQueue}.
+ *
+ * @since 2.7
+ */
+public class DisruptorBlockingQueueFactory<E> implements 
BlockingQueueFactory<E> {
+    @Override
+    public BlockingQueue<E> create(int capacity) {
+        return new DisruptorBlockingQueue<E>(capacity);
+    }
+}

Reply via email to