Hi Sergey: Sorry for replying a little bit late. But I reverted the code as you mentioned /mbean/{id} must not be changed.
Code has be synced to github: https://github.com/dabaipang/services /** * Specification: * Function 1: * Jmx Server: * sub-resource locator * http://localhost:8080/services/jmx/mbean/0 * http://localhost:8080/services/jmx/mbean/1 * ... * * * Function 2: * Note: search by bus.id, bus.id will be changed on every time server had been bounced. * http://localhost:8080/services/jmx/objectname/org.apache.cxf:* * http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,* * ... * http://localhost:8080/services/jmx/objectname/org.apache.cxf:port=%22CustomerServiceImpl%22,* * http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,port=%22SoapPort%22,type=Bus.Service.Endpoint,* * http://localhost:8080/services/jmx/objectname/org.apache.cxf:type=Bus.Service.Endpoint,* * http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,service=%22%7Bhttp%3A%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl%22,type=Bus.Service.Endpoint,* * http://localhost:8080/services/jmx/objectname/org.apache.cxf:service=%22%7Bhttp%3A%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl%22,* * * Function 3: * Search by service: * http://localhost:8080/services/jmx/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl * http://localhost:8080/services/jmx/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DUserServiceImpl * * Note, above queries are searching these 2, but replace by url encoding from: * {http://server.gsoc.apache.org/}UserServiceImpl * {http://server.gsoc.apache.org/}CustomerServiceImpl * * Search by type: * http://localhost:8080/services/jmx/type/Bus.Service.Endpoint * * Search by port: * http://localhost:8080/services/jmx/port/UserServiceImpl * http://localhost:8080/services/jmx/port/CustomerServiceImpl * http://localhost:8080/services/jmx/port/SoapPort * * Search by domain * http://localhost:8080/services/jmx/domain/org.apache.cxf * * Function 4: * http://localhost:8080/services/jmx/list * * */ Source is also attached. Thank you very much on the reviewing, I am very dedicated to what you have mentioned. Though there was a time in last 2 days, I reformatted the code a little too much:) Regards: Shenglin Qiu > Date: Wed, 8 Jun 2011 10:23:58 +0100 > Subject: Re: Expose MBeans in CXF > From: sberyoz...@gmail.com > To: dabaip...@hotmail.com > CC: dev@cxf.apache.org > > Hi Shenglin > > I'm not sure if I'm confusing you with the comments I'm making...The > source has become cleaner, good progress there, > but I'm not sure what are you doing there at all now. > Why MBeanCollection has become a subresource ? What happened to our > /mbean/{id} handler ? Recall, you had a subresource locator method > dealing with '/mbean/{id}' and you were delegating to MBean to finish > the processing and the only thing I suggested is to have a dedicated > MBeanResource handler which I guess should wrap an individual MBean > and work with it (get its state for now, etc) > > What does > > http://localhost:8080/services/jmx/property/id/0 > > mean ? > > it has to be > > http://localhost:8080/services/jmx/mbean/0 > http://localhost:8080/services/jmx/mbean/1 > > and MBeanResource needs to deal with these URIs. > > Please check my previous email. > have only > 1. list all MBeans in org.apache.cxf domain > /list > 2. find MBeans in org.apache.cxf domain which have a given attribute value > /{attribute}/{value} > 3. find MBeans in org.apache.cxf domain their object names > /objectname/{objectname} > 4. get the represenation of the individual MBean (and later update it, > register event listeners, etc) > /mbean/{id} > > // we haven't discussed it yet - need to be done > 5. Return the counter statistics > > /counters > > 6. Counters for a specific endpoint > > /counters/{servicename} > > Sergey > > On Wed, Jun 8, 2011 at 5:46 AM, Shenglin Qiu <dabaip...@hotmail.com> wrote: > > Hi Sergey: > > > > I attached the src and due to I am working on the mvn project only sync to > > svn, so I will take some time and sync this to github. > > > > And here is an update on the request: > > > > Self-defined demo inbound service: > > http://localhost:8080/services/greeter?wsdl > > http://localhost:8080/services/customerservice/customers > > http://localhost:8080/services/customerservice/customer/firstname/Lois > > http://localhost:8080/services/customerservice/customer/id/1 > > http://localhost:8080/services/userservice/users > > http://localhost:8080/services/userservice/user/1 > > /** > > * Specification: > > * Function 1: > > * Jmx Server: > > * sub-resource locator > > * http://localhost:8080/services/jmx/property/id/0 > > * http://localhost:8080/services/jmx/property/id/1 > > * ... > > * > > * > > * Function 2: > > * Note: search by bus.id, bus.id will be changed on every time server > > had been bounced. > > * http://localhost:8080/services/jmx/objectname/org.apache.cxf:* > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,* > > * ... > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:port=%22CustomerServiceImpl%22,* > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,port=%22SoapPort%22,type=Bus.Service.Endpoint,* > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:type=Bus.Service.Endpoint,* > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,service=%22%7Bhttp%3A%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl%22,type=Bus.Service.Endpoint,* > > * > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:service=%22%7Bhttp%3A%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl%22,* > > * > > * Function 3: > > * Search by service: > > * > > http://localhost:8080/services/jmx/property/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl > > * > > http://localhost:8080/services/jmx/property/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DUserServiceImpl > > * > > * Note, above queries are searching these 2, but replace by url encoding > > from: > > * {http://server.gsoc.apache.org/}UserServiceImpl > > * {http://server.gsoc.apache.org/}CustomerServiceImpl > > * > > * Search by type: > > * http://localhost:8080/services/jmx/property/type/Bus.Service.Endpoint > > * > > * Search by port: > > * http://localhost:8080/services/jmx/property/port/UserServiceImpl > > * http://localhost:8080/services/jmx/property/port/CustomerServiceImpl > > * http://localhost:8080/services/jmx/property/port/SoapPort > > * > > * Function 4: > > * http://localhost:8080/services/jmx/list > > * > > * */ > > > > I will ping you tomorrow morning. > > > > Thank you. > > Regards: > > > > Shenglin Qiu > > > > > >> Date: Wed, 1 Jun 2011 15:32:30 +0100 > >> Subject: Re: Expose MBeans in CXF > >> From: sberyoz...@gmail.com > >> To: dev@cxf.apache.org > >> > >> Hi Shenglin > >> > >> It's a step in the right direction, thanks, but JMXServer still needs > >> to be cleaned up quite a bit. > >> - as I said earlier you have 4 big functions basically duplicating > >> each other. We can't have a method per every attribute a given MBean > >> may have. Have a single function only, max two (one capturing all the > >> attributes, another one - dedicated to objectname/{value}). > >> - Introduce MBeanResource subresource instead of overloading MBean, it > >> will be cleaner and easier to work with > >> - as suggested earlier, update the domain MBean and/or MBeanAttribute > >> such that you could drop a big chunk of code in JMXServer where > >> individual attribute values are set, currently in getMbeanMap (if > >> (attrName.equals("service") then/else)). That is because a number of > >> attributes is basically unlimited, even though we have some well-known > >> ones > >> > >> - getMBeanMap - this is so complex I can't understand what it does. I > >> do understand it returns a thread-safe Map - but I'm finding it > >> difficult to understand how the method achieves that. Please remove > >> all those synchronized blocks and have ConcurrentHashMap. Have atomic > >> integer counter, synchronized exlicitly (in a block) if you prefer, > >> and try to get a simple and effective function implemented. Don't make > >> the logic of that function dependent on a n > >> I don't understand why you use "list" for creating MBean hrefs; > >> > >> - there's no need for having Mbean.id and MBean.href because > >> MBean.href is identifying a given MBean uniquely and thus you could > >> use that calculated href as a key. > >> > >> Thanks, Sergey > >> > >> > >> On Tue, May 31, 2011 at 5:36 PM, Shenglin Qiu <dabaip...@hotmail.com> > >> wrote: > >> > > >> > Hi Sergey: > >> > > >> > Project has been synced to Github: > >> > > >> > Browser: > >> > https://github.com/dabaipang/services > >> > > >> > > >> > Git address: > >> > https://dabaip...@github.com/dabaipang/services.git > >> > or > >> > g...@github.com:dabaipang/services.git > >> > > >> > > >> > Thank you. > >> > > >> > > >> > Regards: > >> > Shenglin Qiu > >> > > >> > > >> > > >> >> From: dabaip...@hotmail.com > >> >> To: sberyoz...@gmail.com > >> >> CC: dev@cxf.apache.org > >> >> Subject: RE: Expose MBeans in CXF > >> >> Date: Tue, 31 May 2011 11:23:38 -0400 > >> >> > >> >> > >> >> Hi Sergey: > >> >> > >> >> > > Function 1: (0 - 5 is continuous, no gap) > >> >> > > Jmx Server: > >> >> > > sub-resource locator > >> >> > > http://localhost:8080/services/jmx/mbean/0 > >> >> > > http://localhost:8080/services/jmx/mbean/1 > >> >> > > >> >> > The id allocation (0, 1, etc) has to be thread safe > >> >> > >> >> Done with: > >> >> private synchronized Map<String, MBean> getMBeansMap(){ > >> >> .... > >> >> } > >> >> My reason not using synchronized block but using synchronized method > >> >> is: > >> >> this guarantees the order on mbeansMap's initialization, so when it's > >> >> called by a lot of requests, the followings will have to wait, unit the > >> >> first one finished, after that, following requests will see mbeansMap > >> >> has > >> >> been initialized, and simply return mbeansMap without initializing it > >> >> again. > >> >> > >> >> > >> >> > http://localhost:8080/services/jmx/objectname/org.apache.cxf:* > >> >> > or > >> >> > http://localhost:8080/services/jmx/objectname/org.apache.cxf > >> >> > > >> >> > should also work > >> >> > > >> >> > > > >> >> > >> >> http://localhost:8080/services/jmx/objectname/org.apache.cxf:* > >> >> is working. > >> >> > >> >> > > Due to the URL duplication with /mbean/{id}, I can't put > >> >> > > {searchtype}/{query}, so I put things like: > >> >> > > >> >> > Personally I'd prefer to keep a URI as minimal as possible. > >> >> > > >> >> > /mbean/{id} > >> >> > and > >> >> > {searchtype}/{query} > >> >> > > >> >> > do not duplicate each other given that /mbean/{id} is more specific > >> >> > than {searchtype}/{query}. > >> >> > Likewise /objectname/{objectname} is more specific than > >> >> > {searchtype}/{query}, so consider dropping /search/ part, > >> >> > we may have a dedicated /search handler later on. > >> >> > >> >> Done by dedicating each request per method: > >> >> @GET > >> >> @POST > >> >> @Path("/list") > >> >> public MBeanCollection list() > >> >> > >> >> @Path("/mbean/") > >> >> public MBean locateMBean() > >> >> > >> >> > >> >> @GET > >> >> @POST > >> >> @Path("/type/{query}") > >> >> public MBeanCollection searchMBeansByType(@PathParam("query") > >> >> String query) > >> >> > >> >> > >> >> @GET > >> >> @POST > >> >> @Path("/port/{query}") > >> >> public MBeanCollection searchMBeansByPort(@PathParam("query") > >> >> String query) > >> >> > >> >> > >> >> @GET > >> >> @POST > >> >> @Path("/service/{query}") > >> >> public MBeanCollection searchMBeansByService(@PathParam("query") > >> >> String query) > >> >> > >> >> > >> >> @GET > >> >> @POST > >> >> @Path("/objectname/{objectname}") > >> >> public MBeanCollection getComponent(@PathParam("objectname") > >> >> String objectname) > >> >> > >> >> I remembered you mentioned to handle Exceptions once, currently I am > >> >> still 'throws' -ing them out, I will make the try catch block. > >> >> Should I also add a new object which display the error or simply return > >> >> empty? > >> >> > >> >> > >> >> Thank you very much. > >> >> > >> >> > >> >> Regards: > >> >> Shenglin Qiu > >> >> > >> >> > >> >> > Date: Tue, 31 May 2011 10:35:36 +0100 > >> >> > Subject: Re: Expose MBeans in CXF > >> >> > From: sberyoz...@gmail.com > >> >> > To: dev@cxf.apache.org > >> >> > > >> >> > Hi Shenglin > >> >> > > >> >> > Good progress, some comments below > >> >> > > > >> >> > > Function 1: (0 - 5 is continuous, no gap) > >> >> > > Jmx Server: > >> >> > > sub-resource locator > >> >> > > http://localhost:8080/services/jmx/mbean/0 > >> >> > > http://localhost:8080/services/jmx/mbean/1 > >> >> > > >> >> > The id allocation (0, 1, etc) has to be thread safe > >> >> > > >> >> > > > >> >> > > > >> >> > > Function 2: > >> >> > > Note: search by bus.id, bus.id will be changed on every time server > >> >> > > had been > >> >> > > bounced. > >> >> > > > >> >> > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:bus.id=cxf28619341,* > >> >> > > ... > >> >> > that is ok, a user does not have to specify them as you demonstrated > >> >> > with queries like > >> >> > > >> >> > > > >> >> > > http://localhost:8080/services/jmx/objectname/org.apache.cxf:port=%22CustomerServiceImpl%22,* > >> >> > I guess > >> >> > > >> >> > http://localhost:8080/services/jmx/objectname/org.apache.cxf:* > >> >> > or > >> >> > http://localhost:8080/services/jmx/objectname/org.apache.cxf > >> >> > > >> >> > should also work > >> >> > > >> >> > > > >> >> > > > >> >> > > I am only now use 2 methods to fulfill: > >> >> > > 1 method for service/{serivce}, port/{port}, type/{type} > >> >> > > 1 method for objectname/{objectname} > >> >> > > >> >> > OK > >> >> > > >> >> > > > >> >> > > Due to the URL duplication with /mbean/{id}, I can't put > >> >> > > {searchtype}/{query}, so I put things like: > >> >> > > >> >> > Personally I'd prefer to keep a URI as minimal as possible. > >> >> > > >> >> > /mbean/{id} > >> >> > and > >> >> > {searchtype}/{query} > >> >> > > >> >> > do not duplicate each other given that /mbean/{id} is more specific > >> >> > than {searchtype}/{query}. > >> >> > Likewise /objectname/{objectname} is more specific than > >> >> > {searchtype}/{query}, so consider dropping /search/ part, > >> >> > we may have a dedicated /search handler later on. > >> >> > > >> >> > The other thing I forgot to mention, please remove all those > >> >> > System.out.println, ping me please if you need some help with setting > >> >> > up a remote debugging session > >> >> > > >> >> > Thanks, Sergey > >> >> > > >> >> > > > >> >> > > Thank you so much! > >> >> > > > >> >> > > Regards: > >> >> > > Shenglin Qiu > >> >> > > > >> >> > >> > > >> > >> > >> > >> -- > >> Sergey Beryozkin > >> > >> Application Integration Division of Talend > >> http://sberyozkin.blogspot.com > > > > > > -- > Sergey Beryozkin > > Application Integration Division of Talend > http://sberyozkin.blogspot.com