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
>> 
>> 
>> 
>> 
>> 

Reply via email to