Hi Sergey:
Here are what I had and although the output maybe simple, I checked outputs and
they look alright, need your opinions:)
1.
Request URL: this is from searching part of endpoint
service="{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl"
http://localhost:8080/demoserver/jaxserver/jmxserver/service/impl.service.ws.gsoc.cxf.apache.org
Response:
<CxfMBeanCollection>
<CxfMBeans>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="CustomerServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
<endpointName>"{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl"</endpointName>
</CxfMBean>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="JaxRsJMXServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}JaxRsJMXServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
<endpointName>"{http://impl.service.ws.gsoc.cxf.apache.org/}JaxRsJMXServiceImpl"</endpointName>
</CxfMBean>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="UserServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
<endpointName>"{http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl"</endpointName>
</CxfMBean>
</CxfMBeans>
</CxfMBeanCollection>
2.
Request: search port="UserServiceImpl"
http://localhost:8080/demoserver/jaxserver/jmxserver/port/"UserServiceImpl"
Response:
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="UserServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
<endpointName>"UserServiceImpl"</endpointName>
</CxfMBean>
3.
Request: search by ObjectName("*******")
http://localhost:8080/demoserver/jaxrs3/jmx/component/org.apache.cxf:type=Bus.Service.Endpoint,*
Response:
<CxfMBeanCollection>
<CxfMBeans>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="JaxRsJMXServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}JaxRsJMXServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
</CxfMBean>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="JMXServer",service="{http://web.management.gsoc.cxf.apache.org/}JMXServer",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
</CxfMBean>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="CustomerServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
</CxfMBean>
<CxfMBean>
<canonicalName>org.apache.cxf:bus.id=cxf568097598,port="UserServiceImpl",service="{http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl",type=Bus.Service.Endpoint</canonicalName>
<domain>org.apache.cxf</domain>
</CxfMBean>
</CxfMBeans>
</CxfMBeanCollection>
My current inbound config ():
<!-- JAX-WS Service Endpoint -->
<jaxws:endpoint id="personService" implementor="#personServ"
address="/PersonService">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass"
value="org.apache.cxf.gsoc.ws.auth.ServerPasswordCallback" />
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
<bean id="instrumentationManager"
class="org.apache.cxf.management.jmx.InstrumentationManagerImpl">
<property name="bus" ref="cxf" />
<property name="enabled" value="true" />
<property name="JMXServiceURL"
value="service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi" />
</bean>
<!-- Wiring the counter repository -->
<bean id="counterRepository"
class="org.apache.cxf.management.counters.CounterRepository">
<property name="bus" ref="cxf" />
</bean>
<!-- JAX-RS Server 1 -->
<jaxrs:server id="userServiceRs" address="/jaxrs1">
<jaxrs:serviceBeans>
<ref bean="userService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- JAX-RS Server 2 -->
<jaxrs:server id="customerServiceRs" address="/jaxrs2">
<jaxrs:serviceBeans>
<ref bean="customerService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- JAX-RS Server 3: This is the old jmx inbound, haven't deleted, but
will do -->
<jaxrs:server id="jmxServiceRs" address="/jaxrs3">
<jaxrs:serviceBeans>
<ref bean="jmxService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- CXF3388: Expose JMXServer: Current testing inbound.-->
<jaxrs:server id="jmxServerRs" address="/jaxserver">
<jaxrs:serviceBeans>
<ref bean="jmxServer" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- This jmxServer should be exposed to jax-rs which should be separated
from other service endpoints -->
<bean id="jmxServer" class="org.apache.cxf.gsoc.management.web.JMXServer">
<property name="managedJaxRsEndpoints">
<list>
<ref bean="userServiceRs"/>
<ref bean="customerServiceRs"/>
</list>
</property>
<property name="managedJaxWsEndpoints">
<list>
<ref bean="personService"/>
</list>
</property>
<property name="managedEndpoints">
<list>
<value>{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl</value>
<value>{http://web.management.gsoc.cxf.apache.org/}JMXServer</value>
<value>{http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl</value>
<value>{http://impl.service.ws.gsoc.cxf.apache.org/}JaxRsJMXServiceImpl</value>
</list>
</property>
<property name="instrumentationManager" ref="instrumentationManager"/>
</bean>
<bean id="userService"
class="org.apache.cxf.gsoc.ws.service.impl.UserServiceImpl" />
<bean id="customerService"
class="org.apache.cxf.gsoc.ws.service.impl.CustomerServiceImpl" />
<bean id="jmxService"
class="org.apache.cxf.gsoc.ws.service.impl.JaxRsJMXServiceImpl" />
I am planning to use this weekend, clean this config and code up, and make Rest
request url shorter as you mentioned. I need your suggestions and ideas. and I
think I am ready for a big surgery on the demoserver.
Code is still in https://[email protected]/dabaipang/demoserver.git
Also, I will go to supermarket and find a scanner for the NDS
Thank you very much!
Regards:
Shenglin Qiu
> Date: Fri, 13 May 2011 11:11:51 +0100
> Subject: Re: Expose MBeans in CXF
> From: [email protected]
> To: [email protected]
>
> Hi
>
> On Fri, May 13, 2011 at 1:19 AM, Shenglin Qiu <[email protected]> wrote:
> >
> > Hi Sergey:
> >
> > Here is the todo list which you have assigned:
> >
> > 1. Have one JAX-WS and JAX-RS endpoints
> > 2. Have your JMXServer as a separate endpoint
> > 3. Injecting a bus reference and registering a listener
> >
> > Your Tips:
> > 1.
> > In
> > the method where bus is injected, get ServerLifeCycleManager.class
> > extension from the bus and register your own ServerLifeCycleListener
> > impl
> > , it has methods such as startServer and stopServer, in
> > startServer(Server server) you can do
> > server.getEndpoint().getService().getQName(),
> > and keep these QNames
> > in the local list and have a method say getManagedEndpoints() which will
> > return the list of those QNames that will be a good start
> >
> > 2.
> >> <bean class="org.apache.cxf.management.web.JMXServer">
> >> ? ?<property name="managedEndpoints">
> >> ? ? ? ? <list>
> >> ? ? ? ? ? ?<value>{http://users.com/rs}UserService</value>
> >> ? ? ? ? ? ?<value>{http://users.com/ws}UserService</value>
> >> ? ? ? ? </list>
> >> ? ?</property>
> >> ? ?<property name="manager" ref="instrumentationManager"/>
> >> </bean>
> > but ?<property name="managedEndpoints"> can be dropped, you can get this
> > list from the bus
> >
> >
> > Currently, I have finished on Step 1 and 2, and you have told me that put
> > step 3 on hold, and make sure JMXServer as a separated enpoint is correct
>
> OK. I don't understand what you've done so far, what decisions have
> been made to do with making sure that
> - list of managed endpoints is returned
> - all MBean representations for all the endpoints are returned,
> - MBeans related to an individual endpoint are returned
>
> Can you please describe what you've done ?
>
> > I am actually stopped at this GET request:
> > I tried:
> > http://localhost:8080/demoserver/jaxserver/jmxserver/service/{http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl
> > And obviously it doesn't work because of the slash in url is not accepted.
> > (I still didn't find a reasonable answer from searching google, shocking)
> >
> Shenglin, you are obviously very well prepared technically but you
> need to change the approach and do it asap. Why do you expect Google
> to tell you why the above URI does not work ?
>
> That URI seems too long anyway
>
> http://localhost:8080/demoserver/jmx?service={http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl
>
> Is the max really and in this particular case I'm presuming this query
> is about getting the list of MBeans reps for a particular managed
> service. Perhaps in the future we can allocate dynamic subresources
> instead for handling endpoint specific MBeans to make URIs shorter for
> this particular case.
>
>
> >
> > Then I reserve slash to back slash and got 500 errors:
> > http://localhost:8080/demoserver/jaxserver/jmxserver/service/{http:\\impl.service.ws.gsoc.cxf.apache.org\}CustomerServiceImpl
> > => There is a 500 error from CXF
> > here is the exception stacktrace:
> >
> > 2011-05-12
> > 20:00:48.657:WARN::/demoserver/jaxserver/jmxserver/service/%7Bhttp:%5
> > C%5Cimpl.service.ws.gsoc.cxf.apache.org%5C%7DCustomerServiceImpl
> > java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: Unexpected
> > interna
> > l error near index 1<|\<| ^
> > at
> > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMess
> > age(AbstractFaultChainInitiatorObserver.java:102)
> > at
> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
> > orChain.java:303)
> > at
> > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti
> > ationObserver.java:113)
> > at
> > org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDes
> > tination.java:97)
> > at
> > org.apache.cxf.transport.servlet.ServletController.invokeDestination(
> > ServletController.java:458)
> > at
> > org.apache.cxf.transport.servlet.ServletController.invoke(ServletCont
> > roller.java:146)
> > at
> > org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCX
> > FServlet.java:148)
> > at
> > org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(Ab
> > stractHTTPServlet.java:179)
> > at
> > org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHT
> > TPServlet.java:108)
> > at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
> > at
> > org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(Abstract
> > HTTPServlet.java:159)
> > at
> > org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511
> > )
> > at
> > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3
> > 90)
> > at
> > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.jav
> > a:216)
> > at
> > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:1
> > 82)
> > at
> > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:7
> > 65)
> > at
> > org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
> >
> > at
> > org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHand
> > lerCollection.java:230)
> > at
> > org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.
> > java:114)
> > at
> > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:1
> > 52)
> > at org.mortbay.jetty.Server.handle(Server.java:326)
> > at
> > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:54
> > 2)
> > at
> > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpCo
> > nnection.java:926)
> > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
> > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
> > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> > at
> > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.ja
> > va:410)
> > at
> > org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.j
> > ava:582)
> >
> >
> > Any suggestions?
>
> Please understand how CXF JAX-RS handles requests, don't try changing
> "/" to "\\" and hope it will work
>
> >
> > Currently I can do the following:
> > http://localhost:8080/demoserver/jaxrs3/jmx/component/org.apache.cxf:type=Bus.Service.Endpoint,*
> > => get Mbean by ObjectName query
>
> What is "/jaxrs3" ? Are you really sure your JMXServer endpoint is separate ?
>
> > http://localhost:8080/demoserver/jaxserver/jmxserver/list
> > => get all Mbeans by
> > ObjectName('*:type=*,*') which query is *:type=*,*
>
> should be just
>
> http://localhost:8080/demoserver/jmx/list
>
> > http://localhost:8080/demoserver/jaxserver/jmxserver/type/Bus.Service.Endpoint
> > => get Mbean by type
> > http://localhost:8080/demoserver/jaxserver/jmxserver/port/%22UserServiceImpl%22
> > => get Mbean by service, %22 is an issue
> > which I can't get rid of it, still working on it.
> > http://localhost:8080/demoserver/jaxserver/jmxserver/service/impl.service.ws.gsoc.cxf.apache.org
> > => get Mbean by part of service such as
> > {http://impl.service.ws.gsoc.cxf.apache.org/}CustomerServiceImpl ->
> >
> >
> > impl.service.ws.gsoc.cxf.apache.org
> >
> /demoserver/jaxserver/jmxserver/type/
> or
> /demoserver/jaxserver/jmxserver/port/
>
> is just too long
>
> /demoserver/jmx?mbean=somembeanname
>
> would probably do; well perhaps, introducing some "types" into URIs
> like /type/, /port/, etc, may also may make sense, but lets make sure
> we have a simple and straightforward approach for getting the list of
> all sorts of MBean representation
>
>
> Thanks, Sergey
> >
> > Thank you.
> >
> > Regards:
> > Shenglin Qiu
> >