cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Expose MBeans in CXF
Date Thu, 09 Jun 2011 12:17:49 GMT
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 <dabaipang@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: sberyozkin@gmail.com
>> To: dabaipang@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 <dabaipang@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: sberyozkin@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 <dabaipang@hotmail.com>
>> >> wrote:
>> >> >
>> >> > Hi Sergey:
>> >> >
>> >> > Project has been synced to Github:
>> >> >
>> >> > Browser:
>> >> > https://github.com/dabaipang/services
>> >> >
>> >> >
>> >> > Git address:
>> >> > https://dabaipang@github.com/dabaipang/services.git
>> >> > or
>> >> > git@github.com:dabaipang/services.git
>> >> >
>> >> >
>> >> > Thank you.
>> >> >
>> >> >
>> >> > Regards:
>> >> > Shenglin Qiu
>> >> >
>> >> >
>> >> >
>> >> >> From: dabaipang@hotmail.com
>> >> >> To: sberyozkin@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: sberyozkin@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

Mime
View raw message