<div dir="ltr"><div>I suppose the part &quot;Specifications that define an SPI&quot; only covers those under the EE umbrella, though the document is about SE?</div><div><br></div><div><br></div><div>Werner</div><div><br></div><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 18, 2014 at 1:26 PM,  <span dir="ltr">&lt;<a href="mailto:cdi-dev-request@lists.jboss.org" target="_blank">cdi-dev-request@lists.jboss.org</a>&gt;</span> wrote:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">Send cdi-dev mailing list submissions to<br>
        <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
or, via email, send a message with subject or body &#39;help&#39; to<br>
        <a href="mailto:cdi-dev-request@lists.jboss.org">cdi-dev-request@lists.jboss.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:cdi-dev-owner@lists.jboss.org">cdi-dev-owner@lists.jboss.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of cdi-dev digest...&quot;<br>
<br>
<br>
Today&#39;s Topics:<br>
<br>
   1. Re: Today&#39;s meeting will be shorter and about SE (John D. Ament)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Thu, 18 Dec 2014 07:26:02 -0500<br>
From: &quot;John D. Ament&quot; &lt;<a href="mailto:john.d.ament@gmail.com">john.d.ament@gmail.com</a>&gt;<br>
Subject: Re: [cdi-dev] Today&#39;s meeting will be shorter and about SE<br>
To: Jos? Paumard &lt;<a href="mailto:jose.paumard@gmail.com">jose.paumard@gmail.com</a>&gt;<br>
Cc: cdi-dev &lt;<a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a>&gt;<br>
Message-ID:<br>
        &lt;CAOqetn-dUX8HP5v9hCYKP-i8eViK69ZXDf0urtqUv1GtL=<a href="mailto:10RA@mail.gmail.com">10RA@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;utf-8&quot;<br>
<br>
I would recommend that at least some of these comments make their way into<br>
the google doc.  Things like BeanManager come from there.<br>
<br>
I simply dropped a huge code snippet in here since there was no easy way to<br>
include it in the doc.<br>
<br>
On Thu, Dec 18, 2014 at 5:57 AM, Jos? Paumard &lt;<a href="mailto:jose.paumard@gmail.com">jose.paumard@gmail.com</a>&gt;<br>
wrote:<br>
&gt;<br>
&gt; Yes, there are good use cases for letting the user provide his own ES to<br>
&gt; have async calls executed in them. They are the same kind of use cases we<br>
&gt; have for CompletionStage.<br>
&gt;<br>
&gt; Jos?<br>
&gt;<br>
&gt; 2014-12-18 10:18 GMT+01:00 Romain Manni-Bucau &lt;<a href="mailto:rmannibucau@gmail.com">rmannibucau@gmail.com</a>&gt;:<br>
&gt;&gt;<br>
&gt;&gt; 2014-12-18 9:58 GMT+01:00 Jos? Paumard &lt;<a href="mailto:jose.paumard@gmail.com">jose.paumard@gmail.com</a>&gt;:<br>
&gt;&gt; &gt; From what we wrote about async events, ES can be submitted through the<br>
&gt;&gt; &gt; fireAsync call, following the patterns of CompletionStage. We can also<br>
&gt;&gt; &gt; submit a default ES while building a CDI container (a you wrote), and<br>
&gt;&gt; if we<br>
&gt;&gt; &gt; dont the default ES will probably be the default ForkJoinPool.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So we may have more than one ES, making things more complicated than the<br>
&gt;&gt; &gt; pattern you wrote. I think that having the user to close all the ESes<br>
&gt;&gt; will<br>
&gt;&gt; &gt; lead to the same pattern again and again :<br>
&gt;&gt; &gt; for (ES es : cdi.getESes()) {<br>
&gt;&gt; &gt;     myShutdown(es) ;<br>
&gt;&gt; &gt; }<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; Sorry I missed something here: how can we get multiple ES? Basically<br>
&gt;&gt; if CDI needs a ES behing the scene I expect it expose few config like<br>
&gt;&gt; potential concurrent calls number etc...In such a case I&#39;m not sure if<br>
&gt;&gt; having multiple ES would be a good idea.<br>
&gt;&gt;<br>
&gt;&gt; &gt; I&#39;d prefer to have a cdi.shutdown(), cdi.shudownNow() or<br>
&gt;&gt; &gt; cdi.awaitTermination(...) or whatever we call those methods, to<br>
&gt;&gt; encapsulate<br>
&gt;&gt; &gt; this code. Seems cleaner to me. It might look like CDI is becoming an ES<br>
&gt;&gt; &gt; itself, but it&#39;s delegation, not inheritance.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 2014-12-18 9:28 GMT+01:00 Romain Manni-Bucau &lt;<a href="mailto:rmannibucau@gmail.com">rmannibucau@gmail.com</a>&gt;:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Why exposing them? When not simply exposing the executor service (in<br>
&gt;&gt; &gt;&gt; &quot;init&quot; method).<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; CDIContainer cdi =<br>
&gt;&gt; CDIContainer.init(singletonMap(ExecutorService.class,<br>
&gt;&gt; &gt;&gt; myEs));<br>
&gt;&gt; &gt;&gt; // do something awesome<br>
&gt;&gt; &gt;&gt; shutdownAsIwant(myEs);<br>
&gt;&gt; &gt;&gt; cdi.close();<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Would avoid to have a lot of method several users will not care about.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; By default it would do a if (timeout &lt;= 0 ||<br>
&gt;&gt; &gt;&gt; !defaultEs.awaitTermination(timeout, MILLISECONDS)) { for (Runnable r<br>
&gt;&gt; &gt;&gt; : defaultEs.shutdownNow()) { try { r.cancel(); } catch(e) { log(e); }<br>
&gt;&gt; &gt;&gt; } } with timeout a property of the init map with a default in<br>
&gt;&gt; &gt;&gt; CDIContainer (constant)<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; wdyt?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Romain Manni-Bucau<br>
&gt;&gt; &gt;&gt; @rmannibucau<br>
&gt;&gt; &gt;&gt; <a href="http://www.tomitribe.com" target="_blank">http://www.tomitribe.com</a><br>
&gt;&gt; &gt;&gt; <a href="http://rmannibucau.wordpress.com" target="_blank">http://rmannibucau.wordpress.com</a><br>
&gt;&gt; &gt;&gt; <a href="https://github.com/rmannibucau" target="_blank">https://github.com/rmannibucau</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; 2014-12-18 9:19 GMT+01:00 Jos? Paumard &lt;<a href="mailto:jose.paumard@gmail.com">jose.paumard@gmail.com</a>&gt;:<br>
&gt;&gt; &gt;&gt; &gt; I think we need to think more about how to close the Container.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; We need to take into account the fact that there wil be async process<br>
&gt;&gt; &gt;&gt; &gt; running in ExecutorServices (SE) or ManagedExecutorServices (EE). So<br>
&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt; shutting down the container will mean shutting down these ES too.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; So I think we should need to carefully look at the way ES are closed.<br>
&gt;&gt; &gt;&gt; &gt; The<br>
&gt;&gt; &gt;&gt; &gt; question being : what do we do with async tasks that are still<br>
&gt;&gt; running :<br>
&gt;&gt; &gt;&gt; &gt; should we abruptely interrupt them ? give them a chance to complete ?<br>
&gt;&gt; &gt;&gt; &gt; All<br>
&gt;&gt; &gt;&gt; &gt; these are exposed in different methods of ES : shutdown(),<br>
&gt;&gt; shutdownNow()<br>
&gt;&gt; &gt;&gt; &gt; and<br>
&gt;&gt; &gt;&gt; &gt; awaitTermination(timeout). Since the container will have to call one<br>
&gt;&gt; of<br>
&gt;&gt; &gt;&gt; &gt; these methods per ES it will manage, I think we should also expose<br>
&gt;&gt; them.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Jos?<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; 2014-12-18 9:14 GMT+01:00 Romain Manni-Bucau &lt;<a href="mailto:rmannibucau@gmail.com">rmannibucau@gmail.com</a><br>
&gt;&gt; &gt;:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; ServiceLoader.load(&lt;api&gt;) = ServiceLoader.load(&lt;api&gt;, tccl)<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; I was thinking to a plain servlet engine (tomcat to not say any<br>
&gt;&gt; name)<br>
&gt;&gt; &gt;&gt; &gt;&gt; and CDI container API to boot in webapps. Having cdi API in tomcat<br>
&gt;&gt; &gt;&gt; &gt;&gt; itself and CDI impl in webapps (Weld in webapp1, OWB in webapp2 for<br>
&gt;&gt; &gt;&gt; &gt;&gt; instance). This would mean using one webapp classloader to find the<br>
&gt;&gt; &gt;&gt; &gt;&gt; booter/container. This is fine excepted if the instance is cached.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Same thought in more complicated about OSGi but I guess it is not<br>
&gt;&gt; yet<br>
&gt;&gt; &gt;&gt; &gt;&gt; the target.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Romain Manni-Bucau<br>
&gt;&gt; &gt;&gt; &gt;&gt; @rmannibucau<br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://www.tomitribe.com" target="_blank">http://www.tomitribe.com</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://rmannibucau.wordpress.com" target="_blank">http://rmannibucau.wordpress.com</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="https://github.com/rmannibucau" target="_blank">https://github.com/rmannibucau</a><br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; 2014-12-18 8:58 GMT+01:00 Jozef Hartinger &lt;<a href="mailto:jharting@redhat.com">jharting@redhat.com</a>&gt;:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; On 12/18/2014 08:48 AM, Romain Manni-Bucau wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; Hi guys,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; - why shutdown and not AutoClosable?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; I like this idea.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; - about instance: it uses TCCL to load the impls, not sure it is<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; intended but depending the deployment it can be an issue (is this<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; api<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; 100% JavaSE + flat classpath - ie more constrained than JavaSE?)<br>
&gt;&gt; +<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; most of javax SPI creates a new instance each time &quot;creator&quot; is<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; called.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; I don&#39;t follow. Who uses TCCL?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; - Why Booter and not Container (better than factory IMO)? 1) for<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; consistency with other spec, 2) why can I shutdown a booter ;)?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Exactly<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; Romain Manni-Bucau<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; @rmannibucau<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; <a href="http://www.tomitribe.com" target="_blank">http://www.tomitribe.com</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; <a href="http://rmannibucau.wordpress.com" target="_blank">http://rmannibucau.wordpress.com</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; <a href="https://github.com/rmannibucau" target="_blank">https://github.com/rmannibucau</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; 2014-12-18 8:37 GMT+01:00 Jozef Hartinger &lt;<a href="mailto:jharting@redhat.com">jharting@redhat.com</a>&gt;:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; On 12/18/2014 04:33 AM, John D. Ament wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; I thought today&#39;s meeting was pretty good.  Based on one of the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; discussion<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; points, I wanted to try putting together an interface that<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; described<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; boot paradigm.  Unfortunately even in Java 8 it doesn&#39;t work too<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; well,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; I<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; cannot assign a static variable in an interface the way I can<br>
&gt;&gt; in an<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; abstract<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; class.  More importantly, it doesn&#39;t give us the private level<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; expectation I<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; would look for in this case.  I best I could come up with using<br>
&gt;&gt; an<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; interface<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; is:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; public interface CDIBooter {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      default BeanManager initialize() {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          return initialize(new HashMap&lt;&gt;());<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      BeanManager initialize(Map&lt;?,?&gt; properties);<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Why BeanManager? I think it would be better to return CDI or its<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; subclass<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; rather than this low-level SPI. With the CDI class we get more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; user-friendly<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Instance&lt;T&gt; for free. We could also expose Event&lt;T&gt; similarly.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      void shutdown();<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      class BootHolder {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          static CDIBooter instance = null;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      static CDIBooter instance() {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          if(BootHolder.instance == null) {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              ServiceLoader&lt;CDIBooter&gt; serviceLoader =<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; ServiceLoader.load(CDIBooter.class);<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              for(CDIBooter booter : serviceLoader) {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;                  BootHolder.instance = booter;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;                  break;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          return BootHolder.instance;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; where as the abstract class is a bit briefer, while also being<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; private.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; public abstract class CDIBooter {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      public BeanManager initialize() {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          return initialize(new HashMap&lt;&gt;());<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      public abstract BeanManager initialize(Map&lt;?,?&gt;<br>
&gt;&gt; properties);<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      public abstract void shutdown();<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      private static CDIBooter instance = null;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      public static CDIBooter instance() {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          if(instance == null) {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              ServiceLoader&lt;CDIBooter&gt; serviceLoader =<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; ServiceLoader.load(CDIBooter.class);<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              for(CDIBooter booter : serviceLoader) {<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;                  instance = booter;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;                  break;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;              }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;          return instance;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;      }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Obviously ignore concurrency issues, etc.  It does look to be<br>
&gt;&gt; safer<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; do<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; an<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; abstract class, rather than a factory-interface.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; John<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; On Wed Dec 17 2014 at 10:40:44 AM Antoine Sabot-Durand<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:antoine@sabot-durand.net">antoine@sabot-durand.net</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Hi all,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; I have business matter and will have to shorten the meeting<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; tonight<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; (half<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; an hour instead of 1h).<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; I updated the SE doc and Antonio added useful annexes :<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; <a href="https://docs.google.com/document/d/1LgsGT-AAlrF72Z5pW4xNQiVjUHGUME46ZmB-wwF35Yw/edit?usp=sharing" target="_blank">https://docs.google.com/document/d/1LgsGT-AAlrF72Z5pW4xNQiVjUHGUME46ZmB-wwF35Yw/edit?usp=sharing</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; I propose we focus on this in these 30 mn<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; regards,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Antoine<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; cdi-dev mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Note that for all code provided on this list, the provider<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; licenses<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; code under the Apache License, Version 2<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all<br>
&gt;&gt; other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; ideas<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; provided on this list, the provider waives all patent and other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; intellectual<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; property rights inherent in such information.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; cdi-dev mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Note that for all code provided on this list, the provider<br>
&gt;&gt; licenses<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; code<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; under the Apache License, Version 2<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all<br>
&gt;&gt; other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; ideas<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; provided on this list, the provider waives all patent and other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; intellectual<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; property rights inherent in such information.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; cdi-dev mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Note that for all code provided on this list, the provider<br>
&gt;&gt; licenses<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; code<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; under the Apache License, Version 2<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all<br>
&gt;&gt; other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; ideas<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; provided on this list, the provider waives all patent and other<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; intellectual<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; property rights inherent in such information.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; cdi-dev mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Note that for all code provided on this list, the provider licenses<br>
&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; code under the Apache License, Version 2<br>
&gt;&gt; &gt;&gt; &gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other<br>
&gt;&gt; ideas<br>
&gt;&gt; &gt;&gt; &gt;&gt; provided on this list, the provider waives all patent and other<br>
&gt;&gt; &gt;&gt; &gt;&gt; intellectual<br>
&gt;&gt; &gt;&gt; &gt;&gt; property rights inherent in such information.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; --<br>
&gt;&gt; &gt;&gt; &gt; Java le soir Cours Java en ligne<br>
&gt;&gt; &gt;&gt; &gt; Twitter Paris JUG Devoxx France<br>
&gt;&gt; &gt;&gt; &gt; M : <a href="tel:%2B33%206%2076%2082%2091%2047" value="+33676829147">+33 6 76 82 91 47</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; Java le soir Cours Java en ligne<br>
&gt;&gt; &gt; Twitter Paris JUG Devoxx France<br>
&gt;&gt; &gt; M : <a href="tel:%2B33%206%2076%2082%2091%2047" value="+33676829147">+33 6 76 82 91 47</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Java le soir &lt;<a href="http://blog.paumard.org" target="_blank">http://blog.paumard.org</a>&gt; Cours Java en ligne<br>
&gt; &lt;<a href="http://blog.paumard.org/cours-tutoriaux/" target="_blank">http://blog.paumard.org/cours-tutoriaux/</a>&gt;<br>
&gt; Twitter &lt;<a href="http://twitter.com/#!/JosePaumard" target="_blank">http://twitter.com/#!/JosePaumard</a>&gt; Paris JUG<br>
&gt; &lt;<a href="http://www.parisjug.org" target="_blank">http://www.parisjug.org</a>&gt; Devoxx France &lt;<a href="http://www.devoxx.fr" target="_blank">http://www.devoxx.fr</a>&gt;<br>
&gt; M : <a href="tel:%2B33%206%2076%2082%2091%2047" value="+33676829147">+33 6 76 82 91 47</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; cdi-dev mailing list<br>
&gt; <a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;<br>
&gt; Note that for all code provided on this list, the provider licenses the<br>
&gt; code under the Apache License, Version 2 (<br>
&gt; <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other ideas<br>
&gt; provided on this list, the provider waives all patent and other<br>
&gt; intellectual property rights inherent in such information.<br>
&gt;<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://lists.jboss.org/pipermail/cdi-dev/attachments/20141218/dd583504/attachment.html" target="_blank">http://lists.jboss.org/pipermail/cdi-dev/attachments/20141218/dd583504/attachment.html</a><br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
cdi-dev mailing list<br>
<a href="mailto:cdi-dev@lists.jboss.org">cdi-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
<br>
Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>).  For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.<br>
<br>
End of cdi-dev Digest, Vol 49, Issue 23<br>
***************************************<br>
</blockquote></div></div></div>