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.


p

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

Reply via email to