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