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

Reply via email to