Yes, Sergey.

I should have finished listing MBeans correctly and fully first, and then look 
forward for the next.

I will make my code cleaner, my code is synced at 
https://github.com/dabaipang/demoserver


Regards:
Shenglin Qiu

> Date: Thu, 5 May 2011 10:43:59 +0100
> Subject: Re: ServerLifeCycleListener and JMXServer
> From: sberyoz...@gmail.com
> To: dabaip...@hotmail.com
> CC: dev@cxf.apache.org
> 
> Hi Shenglin
> 
> Thanks for this update. I'd like to clarify why I suggested adding
> ServerLifeCycleManager listener.
> The only reason is for JMXServer to be able to keep an internal
> uptodate list of existing CXF endpoints which are currently being
> managed.
> 
> Please check the comments I made in the other (main) thread about it.
> Lets focus right now on only GETing the representations of:
> 1. All CXF MBeans representing all the CXF endpoints
> 2. CXF service-specific MBeans
> 
> I believe you've nearly implemented 1. In order to implement 2, we
> need to know the list of existing CXF services (not MBeans) and
> JMXServer needs to return this list (getListOfManagedServices or
> similar). Next, JMXServer has to be able to return service-scoped
> MBeans (see 2.), it should have a resource method accepting the
> service expanded  qname ({http://bar}service or similar) and return a
> collection of MBeans relevant to this particular service only
> (Service, its Endpoints as well as the bus - the bus is not
> necessarily endpoint specific - but is relevant).
> 
> So whenever your ServerLifeCycleManager listener gets an event it
> updates the (concurrent/thread-safe) list accordingly.
> 
> The question is how to get this list (task 2.) initialized with the
> list of service qnames which have already been created, by the time
> JMXServer is being created itself. Looks like you need to get a
> ServerRegistry extension from the bus and get a list of existing
> Servers (and Services) from it.
> 
> Please see more comments inline
> 
> On Thu, May 5, 2011 at 4:04 AM, Shenglin Qiu <dabaip...@hotmail.com> wrote:
> > Hi Sergey:
> >
> > As you mentioned last time, I am trying to have this
> > ServerLifeCycleManager.class into
> >
> > private ServerLifeCycleManager lifeCycleManager;
> >
> > public void setInstrumentationManager(InstrumentationManagerImpl
> > instrumentationManager) {
> >         this.instrumentationManager = instrumentationManager;
> >         lifeCycleManager =
> > instrumentationManager.getBus().getExtension(ServerLifeCycleManager.class);
> >         lifeCycleManager.registerListener(new ServerLifeCycleListener() {
> >             public void startServer(Server server) {
> >                 String address =
> > server.getEndpoint().getEndpointInfo().getAddress();
> >             }
> >             public void stopServer(Server server) {
> >                 String address =
> > server.getEndpoint().getEndpointInfo().getAddress();
> >             }
> >         });
> >     }
> >
> >     @GET
> >     @POST
> >     @Path("start")
> >     public CxfMBeanCollection start(){
> >         lifeCycleManager.startServer(server);
> >
> >         return ?;
> >     }
> >
> > @GET
> >     @POST
> >     @Path("stop")
> >     public CxfMBeanCollection stop(){
> >         lifeCycleManager.startServer(server);
> >
> >         return ?;
> >     }
> >
> >
> > I am stuck at getting a server instance in start() and stop(); Here is my
> > applicationContext.xml, I think if applicationContext is loaded, then all
> > Jax-Ws and Jax-Rs are started by default, then up in start() function will
> > have duplicated starting issue. I am thinking, should I use non-spring
> > approach, and create JAXRSServerFactoryBean -> create endpoint -> start
> > server in plain java code at first?
> 
> JMXServer should not deal with starting/stopping CXF endpoints - at
> least not at the initial stage,
> at the moment its main 'responsibility' is to show all relevant MBeans
> and also access properties of individual MBeans, and may be modify
> some of the properties, when possible.
> 
> 
> > Either way, I will spend some time more reading jax-rs-frontend-* module.
> >
> >     <!-- 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>
> >
> >     <!-- 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>
> >
> 
> OK, we have 3 application endpoints, one JAX-WS, and JAX-RS endpoints
> 
> >     <!-- CXF3388: Expose JMXServer -->
> >     <jaxrs:server id="jmxServerRs" address="/jaxserver">
> >         <jaxrs:serviceBeans>
> >             <ref bean="jmxServer" />
> >         </jaxrs:serviceBeans>
> >         <jaxrs:extensionMappings>
> >             <entry key="feed" value="application/atom+xml"/>
> >             <entry key="json" value="application/json"/>
> >             <entry key="xml" value="application/xml"/>
> >             <entry key="html" value="text/html"/>
> >         </jaxrs:extensionMappings>
> >     </jaxrs:server>
> >
> 
> OK
> 
> >     <!-- 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="instrumentationManager"
> > ref="instrumentationManager"/>
> >     </bean>
> >
> 
> Right now, we probably do not need "managedJaxRsEndpoints" and
> "managedJaxWsEndpoints" properties - only if we decide at the later
> stage to return the list of MBeans specific to JAX-RS or JAX-WS
> endpoints only then we will use them.
> That may be a good idea, but at the moment please focus on using bus
> extensions only for building up the list of endpoints.
> 
> >     <bean id="userService"
> > class="org.apache.cxf.gsoc.ws.service.impl.UserServiceImpl" />
> >     <bean id="customerService"
> > class="org.apache.cxf.gsoc.ws.service.impl.CustomerServiceImpl" />
> >
> >
> > PS. I saw I a lot check-in at late night, you guys are really working on cxf
> > so hard, my previous web service projects are all 2.3.0, I think I should
> > all migrate the dependencies to 2.4.
> >
> 
> Sure. Please finish the work to do with retrieving the list of all and
> endpoint specific MBeans and then migrate
> 
> To summarize:
> - Have only InstrumentationManager injected in JMXServer
> - Use the bus to get ServiceRegistry in order to initialize a list of
> existing managed endpoints
> - Register ServerLifeCycleManager Listener for the list to be kept uptodate
> - Have your server returning the list of all CXFMbeans, the list of
> QNames representing managed services/endpoints and service specific
> CXF MBeans
> 
> One you finish this task then we will move on to other ones...
> 
> Ping me on #cxf please if you have any questions
> 
> 
> Thanks, Sergey
> 
> >
> > Regards:
> > Shenglin Qiu
> >
> 
> 
> 
> -- 
> Sergey Beryozkin
> 
> Application Integration Division of Talend
> http://sberyozkin.blogspot.com
                                          

Reply via email to