Hm, that failure appears to be random... Gary
On Mon, Sep 5, 2016 at 5:18 PM, Gary Gregory <garydgreg...@gmail.com> wrote: > Locally, I get: > > Failed tests: > RoutingAppenderWithPurgingTest.routingTest:91 Incorrect number of > appenders with IdlePurgePolicy. expected:<3> but was:<1> > > Gary > > On Mon, Sep 5, 2016 at 12:54 PM, Ralph Goers <ralph.go...@dslextreme.com> > wrote: > >> 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/6 >> 5ec9bce >> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6 >> 5ec9bce >> > >> > 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/6 >> 5ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/co >> re/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/app >> ender/AsyncAppender.java >> > index 3c9c37c..dee5e50 100644 >> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/app >> ender/AsyncAppender.java >> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/app >> ender/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.DiscardingAsyncQueueFull >> Policy; >> > 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.cons >> traints.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.<LogE >> vent>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/6 >> 5ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/co >> re/async/ArrayBlockingQueueFactory.java >> > ---------------------------------------------------------------------- >> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/asy >> nc/ArrayBlockingQueueFactory.java >> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/6 >> 5ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/co >> re/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/asy >> nc/BlockingQueueFactory.java >> > index ccd1625..5763d1e 100644 >> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/BlockingQueueFactory.java >> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/6 >> 5ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/co >> re/async/DisruptorBlockingQueueFactory.java >> > ---------------------------------------------------------------------- >> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/asy >> nc/DisruptorBlockingQueueFactory.java >> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/6 >> 5ec9bce/log4j-core/src/main/java/org/apache/logging/log4j/co >> re/async/LinkedTransferQueueFactory.java >> > ---------------------------------------------------------------------- >> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/asy >> nc/LinkedTransferQueueFactory.java >> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/asy >> nc/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/6 >> 5ec9bce/log4j-core/src/test/java/org/apache/logging/log4j/co >> re/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/app >> ender/AsyncAppenderTest.java >> > index 3066f38..076fdd0 100644 >> > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/app >> ender/AsyncAppenderTest.java >> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/app >> ender/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).with >> SystemProperty(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/6 >> 5ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-A >> rrayBlockingQueue.xml >> > ---------------------------------------------------------------------- >> > diff --git >> > a/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBlockingQueue.xml >> b/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBl >> ockingQueue.xml >> > new file mode 100644 >> > index 0000000..e8bbfa6 >> > --- /dev/null >> > +++ b/log4j-core/src/test/resources/BlockingQueueFactory-ArrayBl >> ockingQueue.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/6 >> 5ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-D >> isruptorBlockingQueue.xml >> > ---------------------------------------------------------------------- >> > diff --git >> > a/log4j-core/src/test/resources/BlockingQueueFactory-DisruptorBlockingQueue.xml >> b/log4j-core/src/test/resources/BlockingQueueFactory-Disrupt >> orBlockingQueue.xml >> > new file mode 100644 >> > index 0000000..268cca7 >> > --- /dev/null >> > +++ b/log4j-core/src/test/resources/BlockingQueueFactory-Disrupt >> orBlockingQueue.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/6 >> 5ec9bce/log4j-core/src/test/resources/BlockingQueueFactory-L >> inkedTransferQueue.xml >> > ---------------------------------------------------------------------- >> > diff --git >> > a/log4j-core/src/test/resources/BlockingQueueFactory-LinkedTransferQueue.xml >> b/log4j-core/src/test/resources/BlockingQueueFactory-LinkedT >> ransferQueue.xml >> > new file mode 100644 >> > index 0000000..13063d3 >> > --- /dev/null >> > +++ b/log4j-core/src/test/resources/BlockingQueueFactory-LinkedT >> ransferQueue.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 >> >> > > > -- > E-Mail: garydgreg...@gmail.com | ggreg...@apache.org > Java Persistence with Hibernate, Second Edition > <http://www.manning.com/bauer3/> > JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > Spring Batch in Action <http://www.manning.com/templier/> > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory