For the record, I am voting -1 on this commit. It breaks the build because the DisruptorBlockingQueueFactory has a dependency that requires Java 8. The 2.7 release is blocked until this is corrected.
Ralph > On Sep 4, 2016, at 11:38 AM, mattsic...@apache.org wrote: > > Convert BlockingQueueFactory into a plugin element > > Related to LOG4J2-1430. > > > Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/65ec9bce > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/65ec9bce > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/65ec9bce > > Branch: refs/heads/master > Commit: 65ec9bcef74dc30ecab9c2091c6e0638d53490d8 > Parents: 0848d7a > Author: Matt Sicker <boa...@gmail.com> > Authored: Fri Jun 17 18:51:08 2016 -0500 > Committer: Matt Sicker <boa...@gmail.com> > Committed: Fri Jun 17 18:51:08 2016 -0500 > > ---------------------------------------------------------------------- > .../log4j/core/appender/AsyncAppender.java | 24 +++++++++--- > .../core/async/ArrayBlockingQueueFactory.java | 10 +++++ > .../log4j/core/async/BlockingQueueFactory.java | 13 ++++++- > .../async/DisruptorBlockingQueueFactory.java | 11 +++++- > .../core/async/LinkedTransferQueueFactory.java | 10 +++++ > .../log4j/core/appender/AsyncAppenderTest.java | 16 ++++---- > .../BlockingQueueFactory-ArrayBlockingQueue.xml | 40 ++++++++++++++++++++ > ...ckingQueueFactory-DisruptorBlockingQueue.xml | 40 ++++++++++++++++++++ > ...BlockingQueueFactory-LinkedTransferQueue.xml | 40 ++++++++++++++++++++ > 9 files changed, 189 insertions(+), 15 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java > index 3c9c37c..dee5e50 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java > @@ -26,8 +26,11 @@ import org.apache.logging.log4j.core.AbstractLogEvent; > import org.apache.logging.log4j.core.Appender; > import org.apache.logging.log4j.core.Filter; > import org.apache.logging.log4j.core.LogEvent; > +import org.apache.logging.log4j.core.async.ArrayBlockingQueueFactory; > import org.apache.logging.log4j.core.async.AsyncQueueFullPolicy; > import org.apache.logging.log4j.core.async.AsyncQueueFullPolicyFactory; > +import org.apache.logging.log4j.core.async.BlockingQueueFactory; > +import org.apache.logging.log4j.core.async.BlockingQueueFactoryUtil; > import org.apache.logging.log4j.core.async.DiscardingAsyncQueueFullPolicy; > import org.apache.logging.log4j.core.async.EventRoute; > import org.apache.logging.log4j.core.config.AppenderControl; > @@ -42,7 +45,6 @@ import > org.apache.logging.log4j.core.config.plugins.PluginConfiguration; > import org.apache.logging.log4j.core.config.plugins.PluginElement; > import > org.apache.logging.log4j.core.config.plugins.validation.constraints.Required; > import org.apache.logging.log4j.core.impl.Log4jLogEvent; > -import org.apache.logging.log4j.core.async.BlockingQueueFactoryUtil; > import org.apache.logging.log4j.core.util.Constants; > > /** > @@ -73,8 +75,8 @@ public final class AsyncAppender extends AbstractAppender { > > private AsyncAppender(final String name, final Filter filter, final > AppenderRef[] appenderRefs, > final String errorRef, final int queueSize, final > boolean blocking, > - final boolean ignoreExceptions, > - final long shutdownTimeout, final Configuration > config, final boolean includeLocation) { > + final boolean ignoreExceptions, final long > shutdownTimeout, final Configuration config, > + final boolean includeLocation, final > BlockingQueueFactory<LogEvent> blockingQueueFactory) { > super(name, filter, null, ignoreExceptions); > this.queue = > BlockingQueueFactoryUtil.<LogEvent>getBlockingQueueFactory().create(queueSize); > this.queueSize = queueSize; > @@ -217,7 +219,9 @@ public final class AsyncAppender extends AbstractAppender > { > } > > /** > - * Create an AsyncAppender. > + * Create an AsyncAppender. This method is retained for backwards > compatibility. New code should use the > + * {@link Builder} instead. This factory will use {@link > ArrayBlockingQueueFactory} by default as was the behavior > + * pre-2.7. > * > * @param appenderRefs The Appenders to reference. > * @param errorRef An optional Appender to write to if the queue > is full or other errors occur. > @@ -247,7 +251,7 @@ public final class AsyncAppender extends AbstractAppender > { > } > > return new AsyncAppender(name, filter, appenderRefs, errorRef, size, > blocking, ignoreExceptions, > - shutdownTimeout, config, includeLocation); > + shutdownTimeout, config, includeLocation, new > ArrayBlockingQueueFactory<LogEvent>()); > } > > @PluginBuilderFactory > @@ -290,6 +294,9 @@ public final class AsyncAppender extends AbstractAppender > { > @PluginBuilderAttribute > private boolean ignoreExceptions = true; > > + @PluginElement(BlockingQueueFactory.ELEMENT_TYPE) > + private BlockingQueueFactory<LogEvent> blockingQueueFactory = new > ArrayBlockingQueueFactory<>(); > + > public Builder setAppenderRefs(AppenderRef[] appenderRefs) { > this.appenderRefs = appenderRefs; > return this; > @@ -340,10 +347,15 @@ public final class AsyncAppender extends > AbstractAppender { > return this; > } > > + public Builder setBlockingQueueFactory(final > BlockingQueueFactory<LogEvent> blockingQueueFactory) { > + this.blockingQueueFactory = blockingQueueFactory; > + return this; > + } > + > @Override > public AsyncAppender build() { > return new AsyncAppender(name, filter, appenderRefs, errorRef, > bufferSize, blocking, ignoreExceptions, > - shutdownTimeout, configuration, includeLocation); > + shutdownTimeout, configuration, includeLocation, > blockingQueueFactory); > } > } > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java > index e9c99b8..dcad78a 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java > @@ -3,14 +3,24 @@ package org.apache.logging.log4j.core.async; > import java.util.concurrent.ArrayBlockingQueue; > import java.util.concurrent.BlockingQueue; > > +import org.apache.logging.log4j.core.config.Node; > +import org.apache.logging.log4j.core.config.plugins.Plugin; > +import org.apache.logging.log4j.core.config.plugins.PluginFactory; > + > /** > * Factory for creating instances of {@link ArrayBlockingQueue}. > * > * @since 2.7 > */ > +@Plugin(name = "ArrayBlockingQueue", category = Node.CATEGORY, elementType = > BlockingQueueFactory.ELEMENT_TYPE) > public class ArrayBlockingQueueFactory<E> implements BlockingQueueFactory<E> { > @Override > public BlockingQueue<E> create(int capacity) { > return new ArrayBlockingQueue<>(capacity); > } > + > + @PluginFactory > + public static <E> ArrayBlockingQueueFactory<E> createFactory() { > + return new ArrayBlockingQueueFactory<>(); > + } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java > index ccd1625..5763d1e 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java > @@ -9,7 +9,18 @@ import java.util.concurrent.BlockingQueue; > */ > public interface BlockingQueueFactory<E> { > > - String PROPERTY = "log4j.BlockingQueueFactory"; > + /** > + * The {@link > org.apache.logging.log4j.core.config.plugins.Plugin#elementType() element > type} to use for plugins > + * implementing this interface. > + */ > + String ELEMENT_TYPE = "BlockingQueueFactory"; > > + /** > + * Creates a new BlockingQueue with the specified maximum capacity. Note > that not all implementations of > + * BlockingQueue support a bounded capacity in which case the value is > ignored. > + * > + * @param capacity maximum size of the queue if supported > + * @return a new BlockingQueue > + */ > BlockingQueue<E> create(int capacity); > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java > index 8fb3707..add375d 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java > @@ -3,15 +3,24 @@ package org.apache.logging.log4j.core.async; > import java.util.concurrent.BlockingQueue; > > import com.conversantmedia.util.concurrent.DisruptorBlockingQueue; > +import org.apache.logging.log4j.core.config.Node; > +import org.apache.logging.log4j.core.config.plugins.Plugin; > +import org.apache.logging.log4j.core.config.plugins.PluginFactory; > > /** > * Factory for creating instances of {@link DisruptorBlockingQueue}. > * > * @since 2.7 > */ > +@Plugin(name = "DisruptorBlockingQueue", category = Node.CATEGORY, > elementType = BlockingQueueFactory.ELEMENT_TYPE) > public class DisruptorBlockingQueueFactory<E> implements > BlockingQueueFactory<E> { > @Override > public BlockingQueue<E> create(int capacity) { > - return new DisruptorBlockingQueue<E>(capacity); > + return new DisruptorBlockingQueue<>(capacity); > + } > + > + @PluginFactory > + public static <E> DisruptorBlockingQueueFactory<E> createFactory() { > + return new DisruptorBlockingQueueFactory<>(); > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java > index 862fab3..6ab24e7 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java > @@ -20,14 +20,24 @@ package org.apache.logging.log4j.core.async; > import java.util.concurrent.BlockingQueue; > import java.util.concurrent.LinkedTransferQueue; > > +import org.apache.logging.log4j.core.config.Node; > +import org.apache.logging.log4j.core.config.plugins.Plugin; > +import org.apache.logging.log4j.core.config.plugins.PluginFactory; > + > /** > * Factory for creating instances of {@link LinkedTransferQueue}. > * > * @since 2.7 > */ > +@Plugin(name = "LinkedTransferQueue", category = Node.CATEGORY, elementType > = BlockingQueueFactory.ELEMENT_TYPE) > public class LinkedTransferQueueFactory<E> implements BlockingQueueFactory<E> > { > @Override > public BlockingQueue<E> create(int capacity) { > return new LinkedTransferQueue<>(); > } > + > + @PluginFactory > + public static <E> LinkedTransferQueueFactory<E> createFactory() { > + return new LinkedTransferQueueFactory<>(); > + } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java > > b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java > index 3066f38..076fdd0 100644 > --- > a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java > +++ > b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/AsyncAppenderTest.java > @@ -41,19 +41,21 @@ import static org.junit.Assert.*; > */ > @RunWith(Parameterized.class) > public class AsyncAppenderTest { > - private static final String CONFIG = "log4j-asynch.xml"; > > @Parameterized.Parameters > public static Object[] data() { > - return new Class<?>[]{ > - ArrayBlockingQueueFactory.class, > - DisruptorBlockingQueueFactory.class, > - LinkedTransferQueueFactory.class > + return new String[]{ > + // default async config uses array blocking queue > + "log4j-asynch.xml", > + // override default blocking queue implementations > + "BlockingQueueFactory-ArrayBlockingQueue.xml", > + "BlockingQueueFactory-DisruptorBlockingQueue.xml", > + "BlockingQueueFactory-LinkedTransferQueue.xml" > }; > } > > - public AsyncAppenderTest(final Class<? extends BlockingQueueFactory> > factory) { > - context = new > LoggerContextRule(CONFIG).withSystemProperty(BlockingQueueFactory.PROPERTY, > factory.getName()); > + public AsyncAppenderTest(final String configFileName) { > + context = new LoggerContextRule(configFileName); > } > > @Rule > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBlockingQueue.xml > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBlockingQueue.xml > b/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBlockingQueue.xml > new file mode 100644 > index 0000000..e8bbfa6 > --- /dev/null > +++ > b/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBlockingQueue.xml > @@ -0,0 +1,40 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + 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. > + > +--> > +<Configuration status="OFF" name="ArrayBlockingQueueFactory"> > + > + <Appenders> > + <Console name="STDOUT"> > + <PatternLayout pattern="%m%n"/> > + </Console> > + <List name="List"> > + <PatternLayout pattern="%C %M %m"/> > + </List> > + <Async name="Async" includeLocation="true" error-ref="STDOUT"> > + <AppenderRef ref="List"/> > + <ArrayBlockingQueue/> > + </Async> > + </Appenders> > + > + <Loggers> > + <Root level="debug"> > + <AppenderRef ref="Async"/> > + </Root> > + </Loggers> > + > +</Configuration> > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-DisruptorBlockingQueue.xml > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/resources/BlockingQueueFactory-DisruptorBlockingQueue.xml > > b/log4j-core/src/test/resources/BlockingQueueFactory-DisruptorBlockingQueue.xml > new file mode 100644 > index 0000000..268cca7 > --- /dev/null > +++ > b/log4j-core/src/test/resources/BlockingQueueFactory-DisruptorBlockingQueue.xml > @@ -0,0 +1,40 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + 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. > + > +--> > +<Configuration status="OFF" name="DisruptorBlockingQueueFactory"> > + > + <Appenders> > + <Console name="STDOUT"> > + <PatternLayout pattern="%m%n"/> > + </Console> > + <List name="List"> > + <PatternLayout pattern="%C %M %m"/> > + </List> > + <Async name="Async" includeLocation="true" error-ref="STDOUT"> > + <AppenderRef ref="List"/> > + <DisruptorBlockingQueue/> > + </Async> > + </Appenders> > + > + <Loggers> > + <Root level="debug"> > + <AppenderRef ref="Async"/> > + </Root> > + </Loggers> > + > +</Configuration> > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-LinkedTransferQueue.xml > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/resources/BlockingQueueFactory-LinkedTransferQueue.xml > b/log4j-core/src/test/resources/BlockingQueueFactory-LinkedTransferQueue.xml > new file mode 100644 > index 0000000..13063d3 > --- /dev/null > +++ > b/log4j-core/src/test/resources/BlockingQueueFactory-LinkedTransferQueue.xml > @@ -0,0 +1,40 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + 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. > + > +--> > +<Configuration status="OFF" name="LinkedTransferQueueFactory"> > + > + <Appenders> > + <Console name="STDOUT"> > + <PatternLayout pattern="%m%n"/> > + </Console> > + <List name="List"> > + <PatternLayout pattern="%C %M %m"/> > + </List> > + <Async name="Async" includeLocation="true" error-ref="STDOUT"> > + <AppenderRef ref="List"/> > + <LinkedTransferQueue/> > + </Async> > + </Appenders> > + > + <Loggers> > + <Root level="debug"> > + <AppenderRef ref="Async"/> > + </Root> > + </Loggers> > + > +</Configuration> > \ No newline at end of file > > --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-dev-h...@logging.apache.org