On Sat, Dec 24, 2011 at 6:29 PM, Pid <p...@pidster.com> wrote:

> On 23/12/2011 04:57, S B wrote:
> > On Thu, Dec 22, 2011 at 8:49 PM, Pid <p...@pidster.com> wrote:
> >
> >> On 22/12/2011 10:34, Konstantin Kolinko wrote:
> >>> 2011/12/20 S B <sbl...@gmail.com>:
> >>>> Hi,
> >>>>
> >>>> I created and deployed an MBean in my tomcat. It uses datasource to
> >> connect
> >>>> to DB.
> >>>>
> >>>> My questions is:
> >>>>
> >>>> When I create InitialContext() inside MBean's constructor and pass the
> >>>> envContext to DBManager class to lookup datasource it works fine.
> >> However
> >>>> when I create InitialContext() in DBManager  class, it fails.
> >>>
> >>> IIRC what InitialContext() sees as its environment highly depends on
> >>> what classloader is active. That is TCCL =
> >>> Thread.getContextClassLoader().
> >>>
> >>> So while it is run from within web application your TCCL = your
> >>> webapp's classloader.
> >>>
> >>> When it is invoked from jconsole it might be a separate Thread, not
> >>> related to your web application.
> >>
> >>
> >> Like he ^^^ said.  :)
> >>
> >>
> >> p
> >>
> >>
> >> --
> >>
> >> [key:62590808]
> >>
> >>
> > Hi Pid/Konstantin,
> >
> > yes you are right. I just verified it. When it is invoked from jconsole,
> > the classloader is: sun.misc.Launcher$AppClassLoader@61e63e3d
> > and when it is run within a web application the clasloader is
> > WebAppClassloader.
> >
> > So, how can I force it to use webapp classloader during new
> > InitialContext() while invoking from jconsole
> > One possible way is to reuse the initialContext created during server
> > startup. (pass it as param during invocation from jconsole).
> >
> > Is there a smarter way ??
>
> I am a bit concerned about how you are registering the bean inside the
> bean's own constructor.  I am not clear on how you are subsequently
> unregistering that bean, before the reloading operation - and I am not
> at all clear what the purpose of reloading is anyway.
>
> Is there a reason that the MBean itself needs to be recreated?
>
> Bear in mind that you are attempting to re-initialise the MBean, while
> you are still using it.  This does not seem like a good idea to me.
>
> I would suggest that you either have a separate Manager MBean that does
> the reloading, or just have the reload method call the actual code on
> the DB, without re-initialising the bean.
>
>
> p
>
>
> --
>
> [key:62590808]
>
>
Hi,

un-registering of mbean doesn't happen until servlet's destroy method is
called.
Actually, registration of bean happen only once, ie during server startup.
This time mbean's constructor is called and it is registered with MBean
server.
(I was wrong earlier when I said, constructor is called on each invocation
of reload() method from jconsole. sorry about that. i was lill confused.)

MBean is never re-created. It is created only once and registered only once.

actual flow is:

click reload() on jconsole gui.
*it causes constructor of MBeanImpl to run. (verified from logs.)*  -- *Wrong.
pls disregard this statement.*
calls reload() defined in MBeanImpl.
calls DBManager.reload()
inside DBManager.reload() it fails at InitialContext initContext = new
InitialContext();
the exception is  -  javax.naming.NoInitialContextException: Cannot
instantiate class: org.apache.naming.java.javaURLContextFactory [Root
exception is java.lang.ClassNotFoundException:
org.apache.naming.java.javaURLContextFactory]

Reply via email to