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
>>
>>

Reply via email to