Hi Sergey: I am now at this step from your comment: > Now, there's one thing which is missing from the above representation > and it is a link to a resource which will deal with a particular MBean > (possible updates of properties, handling the notifications). We need > to put it all into a more practical surface so it should be something > like > > <MBeans> > <MBean href="http://localhost:8080/soapdemo/jmx/mbean/1"> > <domain>org.apache.cxf</domain> > <canonicalName>org.apache.cxf:bus.id=cxf5663550,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> > <MBean> > <MBean href="http://localhost:8080/soapdemo/jmx/mbean/2"> > <domain>org.apache.cxf</domain> > <canonicalName>org.apache.cxf:bus.id=cxf5663551,port="UserServiceImpl",service="{http://server.gsoc.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName> > <MBean> > </MBeans> > > where http://localhost:8080/soapdemo/jmx/mbean/1, > http://localhost:8080/soapdemo/jmx/mbean/2, etc, uniquely identify > those individual MBeans only. > > So please update MBean class to have "href" attribute (with > @XmlAttribute). Have a '@Context UriInfo uriinfo' field in JMXServer > class. When you create a response for /list or /service/*, etc, use > UriInfo to get to the *base* UriBuilder which will represent a URI > like "http://localhost:8080/soapdemo/jmx". Next add "mbean" and then a > number like 1/2/etc which identifies a particular MBean, may be a > short objectname instead of the compete canonical name, etc, so and > have UriBuilder to return you > 'http://localhost:8080/soapdemo/jmx/mbean/1', etc: > > String href = builder.path("mbean").path(someUniqueKey).build().toString()
Here is my progress, I use UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder().path(this.getClass(), "list"); and String uniqueKey = Integer.toString(index++); String href = uriBuilder.path(uniqueKey).build().toString(); in each MBean. (Actually, the result is something I never studied before. This is a very interesting topic. I will spend more time on it.) My current response on this url: http://localhost:8080/services/jmx/ <MBeans> <MBean href="http://localhost:8080/services/jmx/list/0"> <attribute> <busId>cxf33425430</busId> <port>"UserServiceImpl"</port> <service>"{http://server.gsoc.apache.org/}UserServiceImpl"</service> <type>Bus.Service.Endpoint</type> </attribute> <canonicalName>org.apache.cxf:bus.id=cxf33425430,port="UserServiceImpl",service="{http://server.gsoc.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName> <domain>org.apache.cxf</domain> </MBean> <MBean href="http://localhost:8080/services/jmx/list/0/1/2/3/4/5"> <attribute> <type>MBeanServerDelegate</type> </attribute> <canonicalName>JMImplementation:type=MBeanServerDelegate</canonicalName> <domain>JMImplementation</domain> </MBean> <MBean href="http://localhost:8080/services/jmx/list/0/1/2/3"> <attribute> <busId>cxf33425430</busId> <type>Bus</type> </attribute> <canonicalName>org.apache.cxf:bus.id=cxf33425430,type=Bus</canonicalName> <domain>org.apache.cxf</domain> </MBean> <MBean href="http://localhost:8080/services/jmx/list/0/1/2/3/4"> <attribute> <busId>cxf33425430</busId> <port>"SoapPort"</port> <service>"{http://org.apache.gsoc.server/Greeter_Soap}SOAPService"</service> <type>Bus.Service.Endpoint</type> </attribute> <canonicalName>org.apache.cxf:bus.id=cxf33425430,port="SoapPort",service="{http://org.apache.gsoc.server/Greeter_Soap}SOAPService",type=Bus.Service.Endpoint</canonicalName> <domain>org.apache.cxf</domain> </MBean> <MBean href="http://localhost:8080/services/jmx/list/0/1"> <attribute> <busId>cxf33425430</busId> <port>"JMXServer"</port> <service>"{http://server.gsoc.apache.org/}JMXServer"</service> <type>Bus.Service.Endpoint</type> </attribute> <canonicalName>org.apache.cxf:bus.id=cxf33425430,port="JMXServer",service="{http://server.gsoc.apache.org/}JMXServer",type=Bus.Service.Endpoint</canonicalName> <domain>org.apache.cxf</domain> </MBean> <MBean href="http://localhost:8080/services/jmx/list/0/1/2"> <attribute> <busId>cxf33425430</busId> <port>"CustomerServiceImpl"</port> <service>"{http://server.gsoc.apache.org/}CustomerServiceImpl"</service> <type>Bus.Service.Endpoint</type> </attribute> <canonicalName>org.apache.cxf:bus.id=cxf33425430,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> <domain>org.apache.cxf</domain> </MBean> </MBeans> Of course, as you required, I format the output. Regards: Shenglin Qiu > Date: Wed, 18 May 2011 11:38:24 +0100 > Subject: Re: Expose MBeans in CXF > From: sberyoz...@gmail.com > To: dev@cxf.apache.org > > Hi Shenglin > > Well done, you are progressing well. > > Note that you don't have to start formatting the updates to the dev > list, it's just > the work as usual, keep it simple please :-). And don't CC to the secretary > :-) > > Some comments below. > > > I am fully upgrade it to 2.4.0, I have some testing phase exceptions > > ocurring even I don't have a test case in maven test src folder. I will > > figure this out later after this doc. > > > If you are seeing some unrelated test failures when building the trunk > then add '-Pfastinstall' > > > The RAR src is attached, hope this 'soap' won't confuse you, it actually has > > 1 soap inbound and 2 restful inbounds. I am always stuck at the naming, > > previous demoserver has been down when I was upgrading, that's another > > story, and I will fix it. > > > > Well, /soapdemo is confusing. > Have the context named as "/services" or "/application" and set the > address of SOAP endpoint as "/soap/greeter" or simply "/greeter" as > you do now. > > <snip/> > > > > Here are the 3 enabled inbound service, including 1 soap webservice and 2 > > Restful service:(They are up and running) > > > > http://localhost:8080/soapdemo/greeter?wsdl > > > > http://localhost:8080/soapdemo/customerservice/customers > > > > http://localhost:8080/soapdemo/customerservice/customer/firstname/Lois > > > > http://localhost:8080/soapdemo/customerservice/customer/id/1 > > > > http://localhost:8080/soapdemo/userservice/users > > > > http://localhost:8080/soapdemo/userservice/user/1 > > > > OK, lets have > http://localhost:8080/services/greeter > http://localhost:8080/services/customerservice > http://localhost:8080/services/userservice > > > > > > > And here is the demo inbound Restful service url which is holding the above > > 3 services MBeans: > > > > http://localhost:8080/soapdemo/jmx/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl > > > > I think you meant to say: > > > http://localhost:8080/soapdemo/jmx > > which is the address of your JMX server endpoint which should be changed to > say > "http://localhost:8080/services/jmx". > > > which is: > > > > http://localhost:8080/soapdemo/jmx/service/{http://server.gsoc.apache.org/}CustomerServiceImpl > > > > http://localhost:8080/soapdemo/jmx/objectname/org.apache.cxf:type=Bus.Service.Endpoint,* > > > > http://localhost:8080/soapdemo/jmx/type/Bus.Service.Endpoint > > > > http://localhost:8080/soapdemo/jmx/list > > > > > > Ok, so what are you saying is that you can have a list of all MBeans > returned, using "/list" or a list of all MBeans which have a matching > objectname or attribute (such as type, service, port, etc) > > I like "http://localhost:8080/soapdemo/jmx/list and > http://localhost:8080/soapdemo/jmx/objectname/" though I think we can > simplify those, but right now make sure that you have something like > @Path("{attribute}/{value}") for a method which serves /service/*, and > /type/* requests. because 'service' and 'type' are attributes and we > can have many attributes. > > > > > Request: > > > > http://localhost:8080/soapdemo/jmx/service/%7Bhttp:%2F%2Fserver.gsoc.apache.org%2F%7DCustomerServiceImpl > > > > Note: this is actually an url encoded string which is from: > > > > http://localhost:8080/soapdemo/jmx/service/{http://server.gsoc.apache.org/}CustomerServiceImpl > > > OK, we should also be able to support > > http://localhost:8080/soapdemo/jmx/service/{http://server.gsoc.apache.org/}* > > which means get all MBeans which have a service attribute with > namespace equal to 'http://server.gsoc.apache.org' > > > > Response: > > > > <MBeanCollection> > > > > <MBeans> > > > > <MBean> > > > > > > <canonicalName>org.apache.cxf:bus.id=cxf5663550,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> > > > > <domain>org.apache.cxf</domain> > > > > > > <endpointName>"{http://server.gsoc.apache.org/}CustomerServiceImpl"</endpointName> > > > > </MBean> > > > > </MBeans> > > > > </MBeanCollection> > > > OK. Please remove MBeanCollection wrapper, you have another wrapper, MBeans. > No need to have quotes around endpointName's value. > How about having MBean representation structured like this: > > <MBean> > <domain>org.apache.cxf</domain> > <canonicalName>org.apache.cxf:bus.id=cxf5663550,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> > <!-- this is another representation of canonical's name > <attributes> > <type>Bus.Service.Endpoint</type> > <service>{http://server.gsoc.apache.org/}CustomerServiceImpl</service> > <endpoint>CustomerServiceImpl</endpoint> > <attributes> > <!-- > This can be ignored for now > <properties/> > --> > </MBean> > > This will make it simpler for consumers to understand - we may support > returning canonicalNames only or alternative, structured reps but for > now just have MBean representation updated as suggested. > > Now, there's one thing which is missing from the above representation > and it is a link to a resource which will deal with a particular MBean > (possible updates of properties, handling the notifications). We need > to put it all into a more practical surface so it should be something > like > > <MBeans> > <MBean href="http://localhost:8080/soapdemo/jmx/mbean/1"> > <domain>org.apache.cxf</domain> > > <canonicalName>org.apache.cxf:bus.id=cxf5663550,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> > <MBean> > <MBean href="http://localhost:8080/soapdemo/jmx/mbean/2"> > <domain>org.apache.cxf</domain> > > <canonicalName>org.apache.cxf:bus.id=cxf5663551,port="UserServiceImpl",service="{http://server.gsoc.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName> > <MBean> > </MBeans> > > where http://localhost:8080/soapdemo/jmx/mbean/1, > http://localhost:8080/soapdemo/jmx/mbean/2, etc, uniquely identify > those individual MBeans only. > > So please update MBean class to have "href" attribute (with > @XmlAttribute). Have a '@Context UriInfo uriinfo' field in JMXServer > class. When you create a response for /list or /service/*, etc, use > UriInfo to get to the *base* UriBuilder which will represent a URI > like "http://localhost:8080/soapdemo/jmx". Next add "mbean" and then a > number like 1/2/etc which identifies a particular MBean, may be a > short objectname instead of the compete canonical name, etc, so and > have UriBuilder to return you > 'http://localhost:8080/soapdemo/jmx/mbean/1', etc: > > String href = builder.path("mbean").path(someUniqueKey).build().toString() > > Now, the question is how to handle requests like > 'http://localhost:8080/soapdemo/jmx/mbean/1' > > Your JMXServer should have a subresource locator, with @Path("mbean") > and without HttpMethod. > This locator will return something like MBeanResource and that class, > at this stage, will have *only* > a single @GET resource method with @Path("{key}") and which will > return the above MBean representaion only, without MBeans wrapper: > > GET http://localhost:8080/soapdemo/jmx/mbean/1 > > returns > > <MBean href="http://localhost:8080/soapdemo/jmx/mbean/1"> > <domain>org.apache.cxf</domain> > > <canonicalName>org.apache.cxf:bus.id=cxf5663550,port="CustomerServiceImpl",service="{http://server.gsoc.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName> > </MBean> > > Having a subresource handly because at the next step we will start > working on dealing with notifications/updatiing properties or invoking > operations somehow when applicable. > > Does it make sense ? If you have any questions or suggestions - please > ask them here or ping me on #cxf > I guess we have two weeks or so and then I'd like to discuss how > LogBrowser can be extended to act as a consumer of your JMXServer > > I'm removing the rest of your message to make it shorter, everything > you posted there looked OK, those who are interested can check the > previous message if needed for more info. > > You are progressing very well. > > Thanks, Sergey > > > > > Thank you. > >ld > > Regards: > > Shenglin Qiu > >