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