This is what I was able to get working. https://github.com/hammock-project/hammock/commit/8f50242634b370b12c1f291a1f3fc83e3d7533c2
However, I'll be honest and say it seems like a big gap that OWB isn't dealing with this. I haven't done thorough testing, but if I'm using SE and an executor service, I could likely hit a similar issue right? On Mon, Apr 9, 2018 at 11:10 AM Romain Manni-Bucau <rmannibu...@gmail.com> wrote: > Yes but this will not work for you John since you will end up with 3 > classloaders instead of 1 still and no singleton service unifying it. > > What can work if you use the default singleton is to register the > existing context for other classloaders: > > DefaultSingletonService.class.cast(singletonInstance).register(loader, > context); > > > Romain Manni-Bucau > @rmannibucau | Blog | Old Blog | Github | LinkedIn | Book > > > 2018-04-09 16:37 GMT+02:00 John D. Ament <johndam...@apache.org>: > > Did you mean ClassLoaderLock in meecrowave? Or something like the Rule > > defined by MonoMeecrowave? > > > > John > > > > On Mon, Apr 9, 2018 at 8:27 AM Mark Struberg <strub...@yahoo.de.invalid> > > wrote: > > > >> John, another proposal. I've implemented the same for the Meecrowave > JUnit > >> integration. > >> Could you create a 'client' UrlClassLoader with no own URLs? > >> And then per your 'slice' switch the TCCL accordingly? > >> > >> That way you will get perfect isolation. > >> > >> LieGrue, > >> strub > >> > >> > >> > Am 09.04.2018 um 14:10 schrieb Romain Manni-Bucau < > rmannibu...@gmail.com > >> >: > >> > > >> > 2018-04-09 14:07 GMT+02:00 John D. Ament <johndam...@apache.org>: > >> > > >> >> On Mon, Apr 9, 2018 at 7:55 AM Romain Manni-Bucau < > >> rmannibu...@gmail.com> > >> >> wrote: > >> >> > >> >>> 2018-04-09 13:34 GMT+02:00 John D. Ament <johndam...@apache.org>: > >> >>> > >> >>>> Yeah, I hit that. I was able to get around the listener issue, but > >> >> then > >> >>>> this still occurred (its actually within OwbCDI where it fails > next). > >> >>>> > >> >>>> Basically, TCCLs don't make sense in SE, and its pretty key to how > OWB > >> >>>> works. > >> >>>> > >> >>> > >> >>> Hmm why? it is as important than in other cases. > >> >>> > >> >>> > >> >>>> > >> >>>> Is there a way that CDI.current() could resolve to the OWBContainer > >> >> that > >> >>>> was used to bootstrap? Since SeContainer implements Instance, > most of > >> >>> the > >> >>>> work would be there already for the CDI object. > >> >>>> > >> >>>> Or should OWB somehow override the finder in OWBInitializer > >> (initialize > >> >>> or > >> >>>> newContainer methods I had in mind). > >> >>>> > >> >>> > >> >>> Think you really want to impl a finder for your particular case. > Sounds > >> >>> like you want a singleton and not a webapp instance but still > >> deploying a > >> >>> webapp, no? > >> >>> > >> >>> > >> >> I was thinking its blocked by the spec, but you have > >> >> your SeContainerSelector so I can replace with my own impl. Not > ideal, > >> >> since SE really should just mean single container but I suppose it > will > >> >> work. > >> >> > >> > > >> > Not sure, in meecrowave or tomee (to come) we support it for N > contexts > >> > potentially. > >> > Spec allows to manipulate one context but still deploy N (N>1) which > is > >> > important for packaged apps (=including N elementary apps). > >> > > >> > If you don't respect the TCCL then you are probably broken with most > >> > mainstream libs - it is sadly common to use the classloader as a key > of a > >> > cache - so maybe the first step is to fix that? > >> > Forcing tomcat or jetty to reuse the launching classloader is quite > easy > >> so > >> > maybe the way to go for your case? > >> > > >> > > >> >> > >> >> > >> >>> > >> >>>> > >> >>>> John > >> >>>> > >> >>>> On Mon, Apr 9, 2018 at 3:21 AM Mark Struberg > >> <strub...@yahoo.de.invalid > >> >>> > >> >>>> wrote: > >> >>>> > >> >>>>> This is kind of a circular issue. > >> >>>>> > >> >>>>> Look at WebBeansContext#getInstance() > >> >>>>> > >> >>>>> public static WebBeansContext getInstance() > >> >>>>> { > >> >>>>> WebBeansContext webBeansContext = > >> >>>>> WebBeansFinder.getSingletonInstance(); > >> >>>>> > >> >>>>> > >> >>>>> And WebBeansFinder.getSingletonInstance() in turn again uses the > >> >> TCCL > >> >>> to > >> >>>>> look up the WebBeansContext. > >> >>>>> > >> >>>>> So even if you create a WebBeansContext with an explicit > >> >> FinderService, > >> >>>> it > >> >>>>> would not make much difference I fear. > >> >>>>> > >> >>>>> LieGrue, > >> >>>>> strub > >> >>>>> > >> >>>>> > >> >>>>>> Am 09.04.2018 um 08:25 schrieb Romain Manni-Bucau < > >> >>>> rmannibu...@gmail.com > >> >>>>>> : > >> >>>>>> > >> >>>>>> Le 9 avr. 2018 02:33, "John D. Ament" <johndam...@apache.org> a > >> >>> écrit > >> >>>> : > >> >>>>>> > >> >>>>>> On Wed, Mar 7, 2018 at 1:33 AM Romain Manni-Bucau < > >> >>>> rmannibu...@gmail.com > >> >>>>>> > >> >>>>>> wrote: > >> >>>>>> > >> >>>>>>> Is it in hammock? Did you force the webapp container to use the > >> >>>>>>> appclassloader in case of a secontainer? > >> >>>>>>> > >> >>>>>> > >> >>>>>> How would I do that? You mean inside of Tomcat? I'd much rather > >> >> put > >> >>>>>> together a solution that works independent of a container, and in > >> >> SE > >> >>>>> since > >> >>>>>> I really want there to be a single context for the JVM. > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> Yes. It is actually the cleanest if you dont support multi apps > >> >>>>> deployment > >> >>>>>> cause this way you unify all libs look ups (ds, beanutils, mp > >> >> config, > >> >>>>> ....) > >> >>>>>> > >> >>>>>> > >> >>>>>> I've narrowed the issue down to the classloader used once the > >> >> servlet > >> >>>>>> listener starts up. It is in fact using the webapp classloader > at > >> >>> that > >> >>>>>> point. > >> >>>>>> > >> >>>>>> I was thinking a cleaner solution would be to create an > additional > >> >>>>>> constructor in WebBeansConfigurationListener that took the proper > >> >>>>>> WebBeansContext to look up, instead of relying on the singleton > >> >>> service > >> >>>>> to > >> >>>>>> look one up. > >> >>>>>> > >> >>>>>> > >> >>>>>> It is the same, you just have to set the singleton service > matching > >> >>>> your > >> >>>>>> environment. > >> >>>>>> > >> >>>>>> You can also delay the cdi startup to be done in the web context > >> >> with > >> >>>> the > >> >>>>>> right tccl. > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>>> > >> >>>>>>> Le 7 mars 2018 03:27, "John D. Ament" <johndam...@apache.org> a > >> >>>> écrit : > >> >>>>>>> > >> >>>>>>>> That pretty much sums up the issue. > >> >>>>>>>> > >> >>>>>>>> When the app starts, the current thread is main. > >> >>>>>>>> When the webapp launches, it doesn't seem to load it properly. > >> >> The > >> >>>>> good > >> >>>>>>>> news is if I override to the main class's thread, it still > >> >> doesn't > >> >>>>> work. > >> >>>>>>>> So there's some inherent flaws. This was by overriding > >> >>>>> SingletonService > >> >>>>>>> to > >> >>>>>>>> use the same OWB container. > >> >>>>>>>> > >> >>>>>>>> I was able to replicate the issue using pain container start up > >> >>> using > >> >>>>> an > >> >>>>>>>> older pattern as well > >> >>>>>>>> > >> >>>>>>>> lifecycle = > >> >>>>>>>> WebBeansContext.currentInstance().getService( > >> >>>> ContainerLifecycle.class); > >> >>>>>>>> lifecycle.startApplication(null); > >> >>>>>>>> > >> >>>>>>>> I'm going to test to see if I see this fixed on 1.x and broken > on > >> >>>> 2.x. > >> >>>>>>>> > >> >>>>>>>> John > >> >>>>>>>> > >> >>>>>>>> On Mon, Mar 5, 2018 at 8:04 AM Mark Struberg > >> >>>> <strub...@yahoo.de.invalid > >> >>>>>> > >> >>>>>>>> wrote: > >> >>>>>>>> > >> >>>>>>>>> Hmm, that should not be necessary at all. > >> >>>>>>>>> > >> >>>>>>>>> The containers should resolve to the same BeanManager, UNLESS > >> >> you > >> >>>> have > >> >>>>>>> a > >> >>>>>>>>> different ClassLoader! > >> >>>>>>>>> But in that case almost everything will be broken anyways. > >> >>>>>>>>> > >> >>>>>>>>> LieGrue, > >> >>>>>>>>> strub > >> >>>>>>>>> > >> >>>>>>>>>> Am 05.03.2018 um 12:31 schrieb John D. Ament < > >> >>>> johndam...@apache.org > >> >>>>>>>> : > >> >>>>>>>>>> > >> >>>>>>>>>> Yes, so that's basically what I'm seeing at issue. The > TCCL's > >> >>> are > >> >>>>>>>>> different, different hierarchies, and as a result it cannot > find > >> >>> the > >> >>>>>>>>> BeanManagerImpl. > >> >>>>>>>>>> > >> >>>>>>>>>> So here's the tricky part. I want to go from the SeContainer > >> >> to > >> >>>> the > >> >>>>>>>>> WebBeansContext. Do I just use WebBeansContext. > >> >>>> getCurrentInstance() > >> >>>>>>> and > >> >>>>>>>>> then override the SingletonService? > >> >>>>>>>>>> > >> >>>>>>>>>> On 2018/03/05 07:40:05, Mark Struberg > >> >> <strub...@yahoo.de.INVALID > >> >>>> > >> >>>>>>>> wrote: > >> >>>>>>>>>>> +1 > >> >>>>>>>>>>> > >> >>>>>>>>>>> The 'core' object in OWB is the WebBeansContext. This > contains > >> >>> the > >> >>>>>> 1 > >> >>>>>>>>> BeanManager for the 'application'. > >> >>>>>>>>>>> > >> >>>>>>>>>>> The lookup is done through the Finder. By default it's > >> >>> basically a > >> >>>>>>>>> Map<ClassLoader, WebBeansContext>. > >> >>>>>>>>>>> But you can change this to a custom one. > >> >>>>>>>>>>> > >> >>>>>>>>>>> Btw CDI.current() will always give you an > >> >> InjectableBeanManager > >> >>>>>>> which > >> >>>>>>>>> is basically a thin wrapper which is Serializable. > >> >>>>>>>>>>> > >> >>>>>>>>>>> LieGrue, > >> >>>>>>>>>>> strub > >> >>>>>>>>>>> > >> >>>>>>>>>>> > >> >>>>>>>>>>> > >> >>>>>>>>>>>> Am 05.03.2018 um 06:44 schrieb Romain Manni-Bucau < > >> >>>>>>>>> rmannibu...@gmail.com>: > >> >>>>>>>>>>>> > >> >>>>>>>>>>>> Hi John > >> >>>>>>>>>>>> > >> >>>>>>>>>>>> The lookup is done depending your finder impl. By default > it > >> >> is > >> >>>> by > >> >>>>>>>>>>>> classloader which means, if you dont end up using the same > >> >>>>>>>>> beanmanagerimpl, > >> >>>>>>>>>>>> you dont have the right tccl in different places - which > has > >> >>>>>>> impacts > >> >>>>>>>> as > >> >>>>>>>>>>>> well. > >> >>>>>>>>>>>> > >> >>>>>>>>>>>> The wrapper instance is not that important here, only the > >> >>>> delegate > >> >>>>>>>> one > >> >>>>>>>>>>>> > >> >>>>>>>>>>>> > >> >>>>>>>>>>>> Le 5 mars 2018 02:19, "John D. Ament" < > johndam...@apache.org > >> >>> > >> >>> a > >> >>>>>>>>> écrit : > >> >>>>>>>>>>>> > >> >>>>>>>>>>>>> Hi > >> >>>>>>>>>>>>> > >> >>>>>>>>>>>>> So I'm noticing when CDI.current().getBeanManager() is > >> >> called, > >> >>>> it > >> >>>>>>>>> returns a > >> >>>>>>>>>>>>> new InjectableBeanManager instance. I have a custom > >> >>> OWBListener > >> >>>>>> ( > >> >>>>>>>>>>>>> https://github.com/hammock-project/hammock/blob/master/ > >> >>>>>>>>>>>>> bootstrap-owb2/src/main/java/ws/ament/hammock/bootstrap/ > >> >>>>>>>>>>>>> owb/OWBListener.java) > >> >>>>>>>>>>>>> which handles the lifecycle references in the servlet > >> >>> container. > >> >>>>>>> I > >> >>>>>>>>> don't > >> >>>>>>>>>>>>> want to start the application, because its already been > >> >>> started > >> >>>>>> by > >> >>>>>>>>> the SE > >> >>>>>>>>>>>>> container so my custom version doesn't do that. > >> >>>>>>>>>>>>> > >> >>>>>>>>>>>>> However, I've noticed that the underlying BeanManager is > not > >> >>> the > >> >>>>>>>> same > >> >>>>>>>>> as > >> >>>>>>>>>>>>> the one used by the SE initialization. Is this on > purpose? > >> >>> Is > >> >>>>>>>> there > >> >>>>>>>>>>>>> something special that has to be done so that the > underlying > >> >>>>>>>>>>>>> BeanManagerImpl on WebBeansContext.getInstance(). > >> >>>>>>>> getBeanManagerImpl() > >> >>>>>>>>>>>>> returns the one created via SE? > >> >>>>>>>>>>>>> > >> >>>>>>>>>>>>> John > >> > >> >