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