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 ?