cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Travis Roy <dabaip...@hotmail.com>
Subject Re: Revised Proposal: GSoC - (CXF-3388) Expose CXF JMX MBeans as the JAX-RS resources‏
Date Mon, 18 Apr 2011 13:35:47 GMT
Yes, Sergey.

I am trying to do this, but so far, can't get rid of the replying on must have @XmlRootElement
annotation for ObjectName. Probably, I need to create some testing purpose mbeans, register
to InstrumentationManagerImpl, and see how they work.

 
@XmlRootElement
public class ObjectNameCollection {
	private Set<ObjectName> endPointNames;

	@XmlElement(name="endpoint")
	@XmlElementWrapper(name="endpoints")
	public Set<ObjectName> getEndPointNames() {
		return endPointNames;
	}

	public void setEndPointNames(Set<ObjectName> endPointNames) {
		this.endPointNames = endPointNames;
	}
}

@GET
@Path("/list")
public ObjectNameCollection list() throws IOException, MalformedObjectNameException, NullPointerException{
		JMXServiceURL url = new JMXServiceURL(jmxServerURL);
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        mbsc = jmxc.getMBeanServerConnection();
        ObjectName queryEndpointName = new ObjectName(ManagementConstants.DEFAULT_DOMAIN_NAME
 + ":type=Bus.Service.Endpoint,*");
        Set<ObjectName> endpointNames = CastUtils.cast(mbsc.queryNames(queryEndpointName,
null));
        ObjectNameCollection objNameCollection = new ObjectNameCollection();
        objNameCollection.setEndPointNames(endpointNames);
        Iterator<ObjectName> it = endpointNames.iterator();
        while(it.hasNext()){
        	ObjectName objectName = it.next();
        	System.out.println("CanonicalName = "+objectName.getCanonicalName());
        	System.out.println("Domain = "+objectName.getDomain());
        }
		return objNameCollection;
}

Another question is, are these all the cxf registered mbeans, (In All known Implementing Classes)
?
 org.apache.cxf.management 
Interface ManagedComponent

All Known Subinterfaces:
Counter
All Known Implementing Classes:
ManagedBus, ManagedEndpoint, PerformanceCounter, ResponseTimeCounter, WorkQueueImplMBeanWrapper,
WorkQueueManagerImplMBeanWrapper



Regards
Shenglin Qiu







On Apr 18, 2011, at 5:54 AM, Sergey Beryozkin wrote:

> Hi
> 
> It is a good progress, I think you are on the right path.
> Just to see that things are really working, introduce ObjectName and
> ManagedComponent JAXB beans which will be initialized from JMX ObjectName
> and ManagedComponent JMX objects.
> 
> That should be enough for GETs to start working. We will think on which HTTP
> verbs to use to start/stop ManageComponents/etc next.
> 
> At this stage just try to get the list of  (JAXB) ObjectNames returned and
> add another method which will return a specific (JAXB) ManagedComponent
> given the query like this:
> 
> GET /jaxrsjms/component/{objectname}
> or
> GET /jaxrsjms/component?name={objectname}
> 
> where {objectname} is one of the returned ObjectNames.
> 
> Cheers, Sergey
> 
> 
> On Sun, Apr 17, 2011 at 12:54 AM, Travis Roy <dabaipang@hotmail.com> wrote:
> 
>> Hi Sergey:
>> 
>> I think i get stuck at the server's returning. Usually, I define my own
>> domain object bound with JAXB annotation, but right now, if I am having this
>> class:
>> 
>> @Path("/jaxrsjmx")
>> @Produces("application/xml")
>> public class JaxRsJMXServiceImpl implements JaxRsJMXService {
>> private static String jmxServerURL =
>> "service:jmx:rmi:///jndi/rmi://localhost:9914/jmxrmi";
>> private static MBeanServerConnection mbsc;
>> @GET
>> @Path("/list")
>> public Set<ObjectName> list() throws IOException,
>> MalformedObjectNameException, NullPointerException{
>> JMXServiceURL url = new JMXServiceURL(jmxServerURL);
>>        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
>>        mbsc = jmxc.getMBeanServerConnection();
>>        ObjectName queryEndpointName = new ObjectName(ManagementConstants.
>> DEFAULT_DOMAIN_NAME  + ":type=Bus.Service.Endpoint,*");
>>        Set<ObjectName> endpointNames = CastUtils.cast(mbsc.queryNames(queryEndpointName,
>> null));
>> return endpointNames;
>> }
>> 
>> 
>> @GET
>> @Path("/start")
>> public ManagedComponent start(){
>> System.out.println("/start");
>> return null;
>> }
>> 
>> 
>> 
>> @GET
>> @Path("/stop")
>> public ManagedComponent stop(){
>> System.out.println("/stop");
>> return null;
>> }
>> 
>> 
>> @GET
>> @Path("/restart")
>> public ManagedComponent restart(){
>> System.out.println("/restart");
>> return null;
>> }
>> }
>> 
>> As you can see, this list() function's return is obviously wrong. So far, I
>> can't figure out a way to properly return a cxf mbean or a list of mbeans,
>> though client can reach the above methods.
>> Usually, I have domain object like this
>> 
>> @XmlRootElement(name = "user")
>> public class User {
>> private Integer id;
>> private String userName;
>> private String firstName;
>> private String lastName;
>> public User(){}
>> public User(Integer id, String userName){
>> this.id = id;
>> this.userName = userName;
>> }
>> public Integer getId() {
>> return id;
>> }
>> public void setId(Integer id) {
>> this.id = id;
>> }
>> public String getUserName() {
>> return userName;
>> }
>> public void setUserName(String userName) {
>> this.userName = userName;
>> }
>> public String getFirstName() {
>> return firstName;
>> }
>> public void setFirstName(String firstName) {
>> this.firstName = firstName;
>> }
>> public String getLastName() {
>> return lastName;
>> }
>> public void setLastName(String lastName) {
>> this.lastName = lastName;
>> }
>> }
>> And I can easily return this 'User' back to client in REST, however, I am
>> just guessing how I am able to wrap/apply this pattern on mbeans.
>> 
>> I need your help.
>> Thank you very much.
>> 
>> Here is part of my spring context:
>>     <import resource="classpath:META-INF/cxf/cxf.xml" />
>>    <!-- <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>
>> -->
>>    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
>>    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
>>    <import resource=
>> "classpath:META-INF/cxf/cxf-extension-ws-security.xml" />
>>    <import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />
>>    <!-- Enable message logging using the CXF logging feature -->
>>    <cxf:bus>
>>        <cxf:features>
>>            <cxf:logging/>
>>        </cxf:features>
>>    </cxf:bus>
>>      <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 -->
>>    <jaxrs:server id="userServiceRs" address="/rest">
>>        <jaxrs:serviceBeans>
>>            <ref bean="userService" />
>>            <ref bean="jmxService" />
>>         </jaxrs:serviceBeans>
>>        <jaxrs:extensionMappings>
>>            <entry key="xml" value="application/xml" />
>>        </jaxrs:extensionMappings>
>>    </jaxrs:server>
>> 
>>    <bean id="userService" class=
>> "com.mycompany.ws.service.impl.UserServiceImpl" />
>>    <bean id="jmxService" class=
>> "com.mycompany.ws.service.impl.JaxRsJMXServiceImpl" />
>> 
>> PS: UserServiceImpl is working totally ok.
>> 
>> 
>> 
>> Regards:
>> Shenglin Qiu
>> 
>> 
>> 
>> 
>> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message