On Tue, Dec 27, 2011 at 4:06 PM, Pid * <p...@pidster.com> wrote:

> On 27 Dec 2011, at 01:33, S B <sbl...@gmail.com> wrote:
>
> > On Mon, Dec 26, 2011 at 3:28 PM, Pid * <p...@pidster.com> wrote:
> >
> >> On 26 Dec 2011, at 09:50, S B <sbl...@gmail.com> wrote:
> >>
> >>> 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]
> >>
> >> OK, but what is the purpose of DBManager.reload()?
> >>
> >>
> >> p
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> >> For additional commands, e-mail: users-h...@tomcat.apache.org
> >>
> >>
> >
> > Hi Pid, Marry Christmas !!!
> > Purpose of DBManager.reload() is to load some application specific data
> > from DB. Pls don't consider reload() as reload of MBean.
> > reload() can better be renamed as loadData().
> >
> > when I invoke reload() from jconsole my application is suppose to make a
> db
> > connection and load app specific data from database.
>
> OK, so why not retain a reference to the DataSource that you're
> getting the connection from?
>
>
> p
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>
yes. thats one possible workaround. I followed similar approach and
retailed reference of Context (which i used to get datasource during
invocation from jconsole).
This approach works.
And as Konstantin earlier said it is because of different class loaders
that I can't do "new InitialContext()" during invocation from jconsole.
*My question is:  how can I force it to use webapp classloader during new
InitialContext() while invoking from jconsole.*

is there a way to do something like
InitialContext.useClassLoader(webaappClassLoader)
?
During server startup InitialContext() used webapp classloader and during
invocation of mbean from jconsole it was some other classloader hence " new
InitialContext()" failed.

you got my question ?

Reply via email to