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);
+ }
+}