You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2016/06/15 19:23:27 UTC

[4/6] logging-log4j2 git commit: Add BlockingQueueFactory and implementations

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/feature/LOG4J2-1430
Commit: b8c9501cf82a35df2ecc2fff44415c5b83388ea6
Parents: 6d4c455
Author: Matt Sicker <bo...@gmail.com>
Authored: Wed Jun 15 14:11:47 2016 -0500
Committer: Matt Sicker <bo...@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);
+    }
+}