Revisit for 2.2... Gary
On Wed, Sep 24, 2014 at 9:59 PM, Matt Sicker <[email protected]> wrote: > Reverted the commit. > > On 24 September 2014 14:30, Matt Sicker <[email protected]> wrote: > >> I'll move it to a branch tonight, sorry about that. And I might be wrong >> about thread safety, but using AtomicReference<State> seems to make more >> sense. >> >> On 24 September 2014 11:47, Gary Gregory <[email protected]> wrote: >> >>> On Wed, Sep 24, 2014 at 12:03 PM, Remko Popma <[email protected]> >>> wrote: >>> >>>> >>>> >>>> On Wed, Sep 24, 2014 at 10:07 PM, Matt Sicker <[email protected]> wrote: >>>> >>>>> Looks like I meant to add this to a different branch. This is how I >>>>> think LifeCycle classes should work, though, so feedback would be good. If >>>>> possible, I'd like to replace the current ALC with the proposed AALC >>>>> (which >>>>> would just be renamed to AbstractLifeCycle). >>>>> >>>> >>> I have to agree here, this would be good to see in a branch for >>> consideration in 2.2. Especially since this is unlikely to be a drop-in >>> replacement. >>> >>> Gary >>> >>> >>>> >>>> Matt, if the intention was for this to go into a different branch, then >>>> perhaps it is best to move these changes to a different branch. I haven't >>>> had a chance to look at this in detail but it looks like quite a big change >>>> to be making a few days before the release... For me I don't think this >>>> week I'll be able to give it the time to review that it deserves... >>>> >>>> >>>>> >>>>> On 24 September 2014 06:43, Gary Gregory <[email protected]> >>>>> wrote: >>>>> >>>>>> Hm... and why does start() behave differently in AALC from ALC? AALC >>>>>> is not used either... so... what is it in there for? >>>>>> >>>>>> Gary >>>>>> >>>>>> On Wed, Sep 24, 2014 at 7:37 AM, Gary Gregory <[email protected] >>>>>> > wrote: >>>>>> >>>>>>> Do we really want two LifeCycle abstract classes? >>>>>>> >>>>>>> Will this not be a case -- like plug in builders vs. factory methods >>>>>>> -- where we have two ways of doing the same thing? >>>>>>> >>>>>>> When do I use one vs. the other? You'd need to Javadoc that at least. >>>>>>> >>>>>>> Shouldn't we just have one way of doing this? >>>>>>> >>>>>>> Gary >>>>>>> ---------- Forwarded message ---------- >>>>>>> From: <[email protected]> >>>>>>> Date: Wed, Sep 24, 2014 at 1:39 AM >>>>>>> Subject: [2/4] git commit: Add LifeCycle abstract class that uses >>>>>>> AtomicReference. >>>>>>> To: [email protected] >>>>>>> >>>>>>> >>>>>>> Add LifeCycle abstract class that uses AtomicReference. >>>>>>> >>>>>>> >>>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>>>>> Commit: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1a332afa >>>>>>> Tree: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1a332afa >>>>>>> Diff: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1a332afa >>>>>>> >>>>>>> Branch: refs/heads/master >>>>>>> Commit: 1a332afa33c55a72ae8ab5ec83cd5964de3fdc67 >>>>>>> Parents: b701951 >>>>>>> Author: Matt Sicker <[email protected]> >>>>>>> Authored: Sun Sep 21 20:30:50 2014 -0500 >>>>>>> Committer: Matt Sicker <[email protected]> >>>>>>> Committed: Tue Sep 23 23:32:49 2014 -0500 >>>>>>> >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> .../log4j/core/AbstractAtomicLifeCycle.java | 102 >>>>>>> +++++++++++++++++++ >>>>>>> .../apache/logging/log4j/core/LifeCycle.java | 9 +- >>>>>>> 2 files changed, 108 insertions(+), 3 deletions(-) >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1a332afa/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java >>>>>>> new file mode 100644 >>>>>>> index 0000000..05a343a >>>>>>> --- /dev/null >>>>>>> +++ >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractAtomicLifeCycle.java >>>>>>> @@ -0,0 +1,102 @@ >>>>>>> +package org.apache.logging.log4j.core; >>>>>>> + >>>>>>> +import java.io.Serializable; >>>>>>> +import java.util.concurrent.atomic.AtomicReference; >>>>>>> + >>>>>>> +import org.apache.logging.log4j.core.util.Throwables; >>>>>>> +import org.apache.logging.log4j.status.StatusLogger; >>>>>>> + >>>>>>> +/** >>>>>>> + * An extensible {@link LifeCycle} using an {@link AtomicReference} >>>>>>> to wrap its {@link LifeCycle.State}. Thus, classes >>>>>>> + * which extend this class will follow the finite state machine as >>>>>>> follows: >>>>>>> + * <ol> >>>>>>> + * <li>When {@link #start()} is called, {@link #doStart()} is >>>>>>> called if and only if this is in the INITIALIZED state or >>>>>>> + * the STOPPED state.</li> >>>>>>> + * <li>Before {@link #doStart()} is called, this will be in the >>>>>>> STARTING state.</li> >>>>>>> + * <li>After {@link #doStart()} is called, this will be in the >>>>>>> STARTED state if no exception was thrown; otherwise, >>>>>>> + * this will be in the INITIALIZED state again, and the exception >>>>>>> thrown will be re-thrown (if unchecked) or wrapped >>>>>>> + * in an {@link java.lang.reflect.UndeclaredThrowableException} and >>>>>>> then rethrown (if checked).</li> >>>>>>> + * <li>When {@link #stop()} is called, {@link #doStop()} is called >>>>>>> if and only if this is in the STARTED state.</li> >>>>>>> + * <li>Before {@link #doStop()} is called, this will be in the >>>>>>> STOPPING state.</li> >>>>>>> + * <li>After {@link #doStop()} is called, this will be in the >>>>>>> STOPPED state. Any exceptions thrown will be re-thrown >>>>>>> + * as described above.</li> >>>>>>> + * </ol> >>>>>>> + * >>>>>>> + * @since 2.1 >>>>>>> + */ >>>>>>> +public abstract class AbstractAtomicLifeCycle implements LifeCycle, >>>>>>> Serializable { >>>>>>> + >>>>>>> + private static final long serialVersionUID = 1L; >>>>>>> + >>>>>>> + protected static final StatusLogger LOGGER = >>>>>>> StatusLogger.getLogger(); >>>>>>> + >>>>>>> + private final AtomicReference<State> state = new >>>>>>> AtomicReference<State>(State.INITIALIZED); >>>>>>> + >>>>>>> + @Override >>>>>>> + public void start() { >>>>>>> + if (state.compareAndSet(State.INITIALIZED, State.STARTING) >>>>>>> || >>>>>>> + state.compareAndSet(State.STOPPED, State.STARTING)) { >>>>>>> + try { >>>>>>> + doStart(); >>>>>>> + state.set(State.STARTED); >>>>>>> + } catch (final Exception e) { >>>>>>> + state.set(State.INITIALIZED); >>>>>>> + Throwables.rethrow(e); >>>>>>> + } >>>>>>> + } >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Performs the start-up logic. This method is called only if >>>>>>> this is in the INITIALIZED or STOPPED state. >>>>>>> + * >>>>>>> + * @throws Exception >>>>>>> + */ >>>>>>> + protected abstract void doStart() throws Exception; >>>>>>> + >>>>>>> + @Override >>>>>>> + public void stop() { >>>>>>> + if (state.compareAndSet(State.STARTED, State.STOPPING)) { >>>>>>> + try { >>>>>>> + doStop(); >>>>>>> + } catch (Exception e) { >>>>>>> + Throwables.rethrow(e); >>>>>>> + } finally { >>>>>>> + state.set(State.STOPPED); >>>>>>> + } >>>>>>> + } >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Performs the tear-down logic. This method is called only if >>>>>>> this is in the STARTED state. >>>>>>> + * >>>>>>> + * @throws Exception >>>>>>> + */ >>>>>>> + protected abstract void doStop() throws Exception; >>>>>>> + >>>>>>> + @Override >>>>>>> + public boolean isStarted() { >>>>>>> + return state.get() == State.STARTED; >>>>>>> + } >>>>>>> + >>>>>>> + @Override >>>>>>> + public boolean isStopped() { >>>>>>> + return state.get() == State.STOPPED; >>>>>>> + } >>>>>>> + >>>>>>> + @Override >>>>>>> + public boolean equals(final Object o) { >>>>>>> + if (this == o) { >>>>>>> + return true; >>>>>>> + } >>>>>>> + if (o == null || getClass() != o.getClass()) { >>>>>>> + return false; >>>>>>> + } >>>>>>> + final AbstractAtomicLifeCycle that = >>>>>>> (AbstractAtomicLifeCycle) o; >>>>>>> + return state.equals(that.state); >>>>>>> + } >>>>>>> + >>>>>>> + @Override >>>>>>> + public int hashCode() { >>>>>>> + return state.hashCode(); >>>>>>> + } >>>>>>> +} >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1a332afa/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java >>>>>>> index e75ebd5..191edcd 100644 >>>>>>> --- >>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java >>>>>>> +++ >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java >>>>>>> @@ -18,7 +18,7 @@ >>>>>>> package org.apache.logging.log4j.core; >>>>>>> >>>>>>> /** >>>>>>> - * All proper Java frameworks implement some sort of object life >>>>>>> cycle. In Log4j, the main interface for handling >>>>>>> + * Generic object life cycle support interface. In Log4j, the main >>>>>>> interface for handling >>>>>>> * the life cycle context of an object is this one. An object first >>>>>>> starts in the {@link State#INITIALIZED} state >>>>>>> * by default to indicate the class has been loaded. From here, >>>>>>> calling the {@link #start()} method will change this >>>>>>> * state to {@link State#STARTING}. After successfully being >>>>>>> started, this state is changed to {@link State#STARTED}. >>>>>>> @@ -26,9 +26,12 @@ package org.apache.logging.log4j.core; >>>>>>> * stopped, this goes into the {@link State#STOPPED} state. In most >>>>>>> circumstances, implementation classes should >>>>>>> * store their {@link State} in a {@code volatile} field or inside >>>>>>> an >>>>>>> * {@link java.util.concurrent.atomic.AtomicReference} dependant on >>>>>>> synchronization and concurrency requirements. >>>>>>> + * >>>>>>> + * @see AbstractLifeCycle >>>>>>> + * @see AbstractAtomicLifeCycle >>>>>>> */ >>>>>>> public interface LifeCycle { >>>>>>> - >>>>>>> + >>>>>>> /** >>>>>>> * Status of a life cycle like a {@link LoggerContext}. >>>>>>> */ >>>>>>> @@ -44,7 +47,7 @@ public interface LifeCycle { >>>>>>> /** Has stopped. */ >>>>>>> STOPPED >>>>>>> } >>>>>>> - >>>>>>> + >>>>>>> void start(); >>>>>>> >>>>>>> void stop(); >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> E-Mail: [email protected] | [email protected] >>>>>>> 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: [email protected] | [email protected] >>>>>> 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 >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Matt Sicker <[email protected]> >>>>> >>>> >>>> >>> >>> >>> -- >>> E-Mail: [email protected] | [email protected] >>> 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 >>> >> >> >> >> -- >> Matt Sicker <[email protected]> >> > > > > -- > Matt Sicker <[email protected]> > -- E-Mail: [email protected] | [email protected] 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
