On Tue, Dec 27, 2011 at 6:55 PM, Konstantin Kolinko <knst.koli...@gmail.com>wrote:
> 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 > > Yes. That makes sense. Thanks :)