I think that we should be clear, in Javadoc, about whether this new method is synchronous/blocking or not.
(I could say the same about quite a few existing methods as well, but let's at least start to be clear about new methods from now.) On Tue, Jan 26, 2016 at 1:31 AM, Matt Sicker <[email protected]> wrote: > I like it! > > On 25 January 2016 at 18:23, Ralph Goers <[email protected]> > wrote: > >> Then the method name would be terminate? I could live with that. I also >> like the fact that when something goes wrong with it then it would be >> interminable ;-) >> >> Ralph >> >> On Jan 25, 2016, at 5:18 PM, Matt Sicker <[email protected]> wrote: >> >> How about Terminable? It's even a real word to boot. >> >> On 25 January 2016 at 18:15, Ralph Goers <[email protected]> >> wrote: >> >>> Yes, well - Serializable actually sounds like it should be a real word. >>> Shutdownable doesn’t - in fact, my mail editor just split it into two words >>> to “help” me. I take a different view. A class that declares it implements >>> an interface isn’t “capable” of anything - it just implements the >>> interface. The interface name is what tells you that the implementing class >>> is able to do something, which is why you have Comparable instead of just >>> Compare, Cloneable instead of just Clone, or Closeable instead of just >>> Close. Would you want Stop instead of Stoppable? I view “able” as just a >>> shorthand way of saying “Capable”, but unfortunately that just doesn’t >>> sound right with Shutdown (at least to me). >>> >>> Here are some “able” alternatives - presumably each would have a >>> corresponding method name instead of shutdown: >>> Terminateable. >>> Completeable. >>> Concludeable. >>> Haltable. >>> Dismissable. >>> Expireable. >>> >>> I suppose we could also use Stoppable but that seems odd since stop is >>> part of Lifecycle. >>> >>> Got a preference? >>> >>> Ralph >>> >>> >>> >>> On Jan 25, 2016, at 4:35 PM, Gary Gregory <[email protected]> >>> wrote: >>> >>> I see some interfaces with "*Capable*" in the name here and there in the >>> FOSS world (but not in the JRE) so I am a little more comfortable with it. >>> >>> I still see plain old "Shutdown" as simpler. >>> >>> I think I've boiled down my feel for this name to the fact that the >>> Capable postfix is redundant since a class implementing any interface is >>> "capable" of that functionality. IOW we have Serializable vs. >>> SerializationCabable, which means the same thing. >>> >>> Gary >>> >>> On Mon, Jan 25, 2016 at 7:27 AM, Ralph Goers <[email protected] >>> > wrote: >>> >>>> What does it feel weird to you? To be honest, I originally named the >>>> interface ‘Shutdown” and then changed it since it really is about >>>> implementing a behavior and “Shutdown” alone doesn’t really describe that. >>>> >>>> Ralph >>>> >>>> On Jan 24, 2016, at 11:09 PM, Gary Gregory <[email protected]> >>>> wrote: >>>> >>>> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory <[email protected]> >>>> wrote: >>>> >>>>> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers < >>>>> [email protected]> wrote: >>>>> >>>>>> Yes, Shutdownable is too weird. >>>>>> >>>>> >>>>> How about calling it simply "Shutdown" then? FooCapable feels weird to >>>>> me. >>>>> >>>>> Can anyone think of other (one-method or not) optional feature-like >>>>> interfaces in the JRE or other code base? >>>>> >>>> >>>> hm... ShutdownService? >>>> >>>> Gary >>>> >>>> >>>>> >>>>> Gary >>>>> >>>>> Closeable would imply there is a close method, not a shutdown method. >>>>>> I have my doubts about the try-with-resources use case here. Virtually >>>>>> all >>>>>> usages are probably going to be to disable automatic shutdown and then >>>>>> the >>>>>> user placing the shutdown call somewhere they can control, which probably >>>>>> will have nothing to do with initialization of logging. >>>>>> >>>>>> Ralph >>>>>> >>>>>> On Jan 24, 2016, at 2:43 PM, Gary Gregory <[email protected]> >>>>>> wrote: >>>>>> >>>>>> Resending, got a error from my phone... >>>>>> ---------- Forwarded message ---------- >>>>>> From: "Gary Gregory" <[email protected]> >>>>>> Date: Jan 24, 2016 1:41 PM >>>>>> Subject: Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown >>>>>> methods to LogManager >>>>>> To: <[email protected]> >>>>>> Cc: >>>>>> >>>>>> Hi all, >>>>>> >>>>>> Any reason not use the usual -able postfix instead of >>>>>> ShutdownCapable: Shutdownable sounds too weird? What about reusing plain >>>>>> old Closeable? That means you could use the context in a >>>>>> try-with-resources >>>>>> block, a bonus. >>>>>> >>>>>> Gary >>>>>> On Jan 24, 2016 10:18 AM, <[email protected]> wrote: >>>>>> >>>>>>> Repository: logging-log4j2 >>>>>>> Updated Branches: >>>>>>> refs/heads/master 7d3aac4b9 -> 2df3f0e72 >>>>>>> >>>>>>> >>>>>>> LOG4J2-124 - Add shutdown methods to LogManager >>>>>>> >>>>>>> >>>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>>>>> Commit: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7 >>>>>>> Tree: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7 >>>>>>> Diff: >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7 >>>>>>> >>>>>>> Branch: refs/heads/master >>>>>>> Commit: 2df3f0e7262c90e3fe1700f053eebf18491650d9 >>>>>>> Parents: 7d3aac4 >>>>>>> Author: Ralph Goers <[email protected]> >>>>>>> Authored: Sun Jan 24 11:18:41 2016 -0700 >>>>>>> Committer: Ralph Goers <[email protected]> >>>>>>> Committed: Sun Jan 24 11:18:41 2016 -0700 >>>>>>> >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> .../org/apache/logging/log4j/LogManager.java | 62 >>>>>>> ++++++++++++++++++++ >>>>>>> .../logging/log4j/spi/ShutdownCapable.java | 17 ++++++ >>>>>>> .../apache/logging/log4j/LogManagerTest.java | 7 +++ >>>>>>> .../logging/log4j/core/LoggerContext.java | 8 ++- >>>>>>> 4 files changed, 93 insertions(+), 1 deletion(-) >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>>>>>> index f10e5a8..64c6ee5 100644 >>>>>>> --- >>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>>>>>> +++ >>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java >>>>>>> @@ -27,6 +27,7 @@ import >>>>>>> org.apache.logging.log4j.simple.SimpleLoggerContextFactory; >>>>>>> import org.apache.logging.log4j.spi.LoggerContext; >>>>>>> import org.apache.logging.log4j.spi.LoggerContextFactory; >>>>>>> import org.apache.logging.log4j.spi.Provider; >>>>>>> +import org.apache.logging.log4j.spi.ShutdownCapable; >>>>>>> import org.apache.logging.log4j.status.StatusLogger; >>>>>>> import org.apache.logging.log4j.util.LoaderUtil; >>>>>>> import org.apache.logging.log4j.util.PropertiesUtil; >>>>>>> @@ -285,6 +286,67 @@ public class LogManager { >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> + * Shutdown using the default LoggerContext. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + public static void shutdown() { >>>>>>> + shutdown(getContext()); >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Shutdown the logging system if the logging system supports >>>>>>> it. >>>>>>> + * @param currentContext if true the LoggerContext for the >>>>>>> caller of this method will be used. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + public static void shutdown(boolean currentContext) { >>>>>>> + shutdown(getContext(currentContext)); >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Shutdown the logging system if the logging system supports >>>>>>> it. >>>>>>> + * @param loader The ClassLoader for the context. If null the >>>>>>> context will attempt to determine the appropriate >>>>>>> + * ClassLoader. >>>>>>> + * @param currentContext if false the LoggerContext appropriate >>>>>>> for the caller of this method will be used. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + public static void shutdown(final ClassLoader loader, final >>>>>>> boolean currentContext) { >>>>>>> + shutdown(getContext(loader, currentContext)); >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Shutdown the logging system if the logging system supports >>>>>>> it. >>>>>>> + * @param context the LoggerContext. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + public static void shutdown(LoggerContext context) { >>>>>>> + if (context != null && context instanceof ShutdownCapable) { >>>>>>> + ((ShutdownCapable) context).shutdown(); >>>>>>> + } >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Shutdown the logging system if the logging system supports >>>>>>> it. >>>>>>> + * @param fqcn The fully qualified class name of the Class that >>>>>>> this method is a member of. >>>>>>> + * @param currentContext if false the LoggerContext appropriate >>>>>>> for the caller of this method will be used. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + protected static void shutdown(final String fqcn, final boolean >>>>>>> currentContext) { >>>>>>> + shutdown(getContext(fqcn, currentContext)); >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> + * Shutdown the logging system if the logging system supports >>>>>>> it. >>>>>>> + * @param fqcn The fully qualified class name of the Class that >>>>>>> this method is a member of. >>>>>>> + * @param loader The ClassLoader for the context. If null the >>>>>>> context will attempt to determine the appropriate >>>>>>> + * ClassLoader. >>>>>>> + * @param currentContext if false the LoggerContext appropriate >>>>>>> for the caller of this method will be used. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> + protected static void shutdown(final String fqcn, final >>>>>>> ClassLoader loader, final boolean currentContext) { >>>>>>> + shutdown(getContext(fqcn, loader, currentContext)); >>>>>>> + } >>>>>>> + >>>>>>> + /** >>>>>>> * Returns the current LoggerContextFactory. >>>>>>> * >>>>>>> * @return The LoggerContextFactory. >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>>>>>> new file mode 100644 >>>>>>> index 0000000..a46ef60 >>>>>>> --- /dev/null >>>>>>> +++ >>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java >>>>>>> @@ -0,0 +1,17 @@ >>>>>>> +/* >>>>>>> + * Copyright (c) 2016 Nextiva, Inc. to Present. >>>>>>> + * All rights reserved. >>>>>>> + */ >>>>>>> +package org.apache.logging.log4j.spi; >>>>>>> + >>>>>>> +/** >>>>>>> + * Interface to be implemented by LoggerContext's that provide a >>>>>>> shutdown method. >>>>>>> + * @since 2.6 >>>>>>> + */ >>>>>>> +public interface ShutdownCapable { >>>>>>> + >>>>>>> + /** >>>>>>> + * Requests that the logging implementation shut down. >>>>>>> + */ >>>>>>> + void shutdown(); >>>>>>> +} >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>>>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>>>>>> index 48f0eea..596a9f2 100644 >>>>>>> --- >>>>>>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>>>>>> +++ >>>>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java >>>>>>> @@ -17,6 +17,7 @@ >>>>>>> package org.apache.logging.log4j; >>>>>>> >>>>>>> import org.apache.logging.log4j.message.ParameterizedMessageFactory; >>>>>>> +import org.apache.logging.log4j.spi.LoggerContext; >>>>>>> import org.junit.Test; >>>>>>> >>>>>>> import static org.junit.Assert.*; >>>>>>> @@ -53,4 +54,10 @@ public class LogManagerTest { >>>>>>> assertNotNull("No Logger returned", logger); >>>>>>> assertTrue("Incorrect Logger name: " + >>>>>>> logger.getName(),LogManagerTest.class.getName().equals(logger.getName())); >>>>>>> } >>>>>>> + >>>>>>> + @Test >>>>>>> + public void testShutdown() { >>>>>>> + LoggerContext loggerContext = LogManager.getContext(false); >>>>>>> + LogManager.shutdown(loggerContext); >>>>>>> + } >>>>>>> } >>>>>>> >>>>>>> >>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> diff --git >>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>>>>>> index 42efbb5..fcdfc16 100644 >>>>>>> --- >>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>>>>>> +++ >>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java >>>>>>> @@ -45,6 +45,7 @@ import >>>>>>> org.apache.logging.log4j.message.MessageFactory; >>>>>>> import org.apache.logging.log4j.spi.AbstractLogger; >>>>>>> import org.apache.logging.log4j.spi.LoggerContextFactory; >>>>>>> import org.apache.logging.log4j.spi.LoggerContextKey; >>>>>>> +import org.apache.logging.log4j.spi.ShutdownCapable; >>>>>>> >>>>>>> import static >>>>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*; >>>>>>> >>>>>>> @@ -54,7 +55,7 @@ import static >>>>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*; >>>>>>> * filters, etc and will be atomically updated whenever a >>>>>>> reconfigure occurs. >>>>>>> */ >>>>>>> public class LoggerContext extends AbstractLifeCycle implements >>>>>>> org.apache.logging.log4j.spi.LoggerContext, >>>>>>> - ConfigurationListener { >>>>>>> + ShutdownCapable, ConfigurationListener { >>>>>>> >>>>>>> /** >>>>>>> * Property name of the property change event fired if the >>>>>>> configuration is changed. >>>>>>> @@ -278,6 +279,11 @@ public class LoggerContext extends >>>>>>> AbstractLifeCycle implements org.apache.loggi >>>>>>> } >>>>>>> >>>>>>> @Override >>>>>>> + public void shutdown() { >>>>>>> + stop(); >>>>>>> + } >>>>>>> + >>>>>>> + @Override >>>>>>> public void stop() { >>>>>>> LOGGER.debug("Stopping LoggerContext[name={}, {}]...", >>>>>>> getName(), this); >>>>>>> configLock.lock(); >>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: [email protected] | [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] >>>> <[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]> >> >> >> > > > -- > Matt Sicker <[email protected]> > -- [image: MagineTV] *Mikael Ståldal* Senior software developer *Magine TV* [email protected] Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com Privileged and/or Confidential Information may be contained in this message. If you are not the addressee indicated in this message (or responsible for delivery of the message to such a person), you may not copy or deliver this message to anyone. In such case, you should destroy this message and kindly notify the sender by reply email.
