On Sun, May 15, 2011 at 5:46 PM, Sergey Beryozkin <sberyoz...@gmail.com> wrote: > Hi > > It looks not too bad, some comments inline... > > On Fri, May 13, 2011 at 5:34 PM, Shenglin Qiu <dabaip...@hotmail.com> wrote: >> >> 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 >> > > What is this query supposed to mean ? Get all Mbeans representing > endpoints whose implementations are in > "impl.service.ws.gsoc.cxf.apache.org" package ? > >> 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> >> >> > > Please remove "Cxf" prefixes and we also don't need to expose > JaxRsJMXServiceImpl > >> >> 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> >> > > We need to be able to get the list of MBean *related to* a particular > service name, such as > {http://impl.service.ws.gsoc.cxf.apache.org/}UserServiceImpl. > >> >> 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> >> > > OK >> >> >> 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> >> > > You said you've managed to avoid injecting references to individual > managed endpoints, I thought we agree that injecting > InstrumentationManager would be sufficient. > >> <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. > > What I'd like to clarify here is that I'm afraid I can't spend a lot > of time on this project and tell you what to do step by step. > I'm happy to help and mentor and I'm trying to provide some feedback > and express some opinion on how things should be implemented. > > But it is your project. Please try to drive it yourself. Review the > JMX/REST related documentation linked from the JIRA, and have some > opinion on how to make sure CXF MBeans can be searched using a number > of queries, so that users could easily get to a collection of Mbeans > or an individual MBean as needed. This is part of the task, make it > easy to get to MBean representations. > > I guess important individual MBeans (those representing > Services/endpoints) should be individually addressed so that we can > say start & stop the service etc. Your server should be able to handle > queries to get the collections of Mbeans but it should probably > provide a subresource locator so that individual MBeans can be asked > to execute certain operations or update the properties. > > JMXServer should keep up to date with the number of available CXF > MBeans - I was suggesting to use CXF-level listeners/registry, but > perhaps a better solution is to register a JMX listener ot query MBean > server for all MBeans in the "org.apache.cxf" domain. That is not > critical now, that can be optimized, but the server should be aware of > all MBeans one way or another. > > > I think you have maximum 2 weeks to make all work well - please keep > focused, provide your opinion on how to proceed, and implement it. > I'll be happy to provide the feedback on the dev list or #cxf. > Then, once you are done, we should consider if we can extend > LogBrowser with the management statisicts or continue improving what > you've already done by then... > > Thanks, Sergey > >> Code is still in https://dabaip...@github.com/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: sberyoz...@gmail.com >>> To: dev@cxf.apache.org >>> >>> Hi >>> >>> On Fri, May 13, 2011 at 1:19 AM, Shenglin Qiu <dabaip...@hotmail.com> >>> 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 >>> > >> >
-- Sergey Beryozkin Application Integration Division of Talend http://sberyozkin.blogspot.com