Hi Sergey: Continue from last talk in im, @Path("/mbean/{id}") public MBean searchMBeanById(@PathParam("id")String id){
@GET @Path("/{property}/{value}") public MBeanCollection searchMBeans(@PathParam("property") String property, @PathParam("value") String value) is now working as desired. What I did wrong is put @Path("/mbean/") public MBean searchMBeanById(){ and put {id} in MBeanResource. Thank you for clarifying this out so hard and finally I make it. I will wrap things up real quick and give you the email update with src. Regards: Shenglin Qiu > Date: Thu, 9 Jun 2011 13:17:49 +0100 > Subject: Re: Expose MBeans in CXF > From: sberyoz...@gmail.com > To: dev@cxf.apache.org > > Hi Shenglin > > One thing which you are doing well is introducing subresources, given > that both MBean and MBeanCotellection have become the ones. > Understanding how subresources work is good in itself. I can see you > have unique ids allocated to MBeans now. So there's some progress. > IMHO some more code cleanup is needed. > > 1. At this stage please have only a ***single*** subresource, > intoroduce a dedicated class called MBeanResource which should have > only a single member, MBean instance. This MBeanResource should only > have right now setMBean(MBean) and getMBean methods. getMBean method > should be annotated with @GET. > > 2. MBean and MBeanCollection should have no static methods, and no > JAX-RS resource methods at all. These are plain JAXB beans only. > > 3. JMXServer should have: > - /mbean/{id} > > Note, Path value should be '/mbean/{id}' > > You should use a captured {id}, such as 0, 1, 2, etc (as opposed > to manually parsing path segments) for locating MBean, set this MBean > on a new MBeanResource instance and return MBeanResource, > MBeanResource.getMBean will complete the processing. we will think > later on how to keep MBeanResources between requests. The reason I'd > like a dedicated MBeanResource wrap MBean is because possible > modifications, update notifications, etc may need to be dealt with and > thus IMHO it can be cleaner to keep MBean as a plain JAXB bean and > have a dedicated JMX-aware handler around it as opposed to making > MBean both JAXB and JMX-aware at the same time. > > - /list > > - /{property}/{value} > > Please note this method, /{property}/{value}, is on JMXServer. Remove > @Path("") and replace it with /{property}/{value}. > > - /objectname/{objectname} > > This method should iterate over the existing MBeanCollection only > without quering the instrumentation manager again. > > 3. All the methods should use the same code for accessing the map - > which is what you already do. Some cleanup is needed there too, but > for now please address the above > > thanks, Sergey > > > On Thu, Jun 9, 2011 at 4:05 AM, Shenglin Qiu <dabaip...@hotmail.com> wrote: > > 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 > > > > > > -- > Sergey Beryozkin > > Application Integration Division of Talend > http://sberyozkin.blogspot.com