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 <dabaip...@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 >> >> >> >> >>