2011/12/27 S B <sbl...@gmail.com>:
> On Tue, Dec 27, 2011 at 4:53 PM, Pid * <p...@pidster.com> wrote:
>
>> On 27 Dec 2011, at 11:16, S B <sbl...@gmail.com> wrote:
>>
>> > 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 ?
>>
>>
>> Yes. I got it.
>>
>> I'm not trying to find a solution because I'm not sure why you insist
>> on doing things the hard way when there is a perfectly reasonable
>> alternative.
>>
>>
>>
> That's fine. I just wanted to confirm whether the reference-retention
> approach is the smartest one or there are any better solution available.
> Thanks for your help.

Either way you have to retain a reference. Be it a WebappClassLoader
reference (and call Thread.setContextClassLoader()) or an object
reference.

The purpose of JNDI is to provide access to configuration. Once you
did the lookup it is better to keep the obtained value.

> :)

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to