4 Replies Latest reply on May 10, 2006 9:12 AM by jaleyba

    Start an MBean in another server

    jaleyba

      Hi All

      I'm new to JBoss and JMX. Nevertheless, I did a little service that starts an embeded ActiveMQ Broker and it's running ok.

      Now, I need to make a service in another server and start it from the end of my working service.

      Is this possible ? Where could I find samples ?


      Thanks in advance

      J

        • 1. Re: Start an MBean in another server
          jaleyba

          Please, could somebody help me in this matter ?

          Thanks in advance

          • 2. Re: Start an MBean in another server
            dimitris

            The first thing is to get remote jmx access to the other server, so you need to lookup the *other* server jmx/rmi adapter in the *other* server jndi.

            Then it depends how you have developed your application. If the mbean classes are available on the other server you could programmatically instantiate and start a service.

            The http://www.jboss.org/wiki/Wiki.jsp?page=FAQJBossJMX is a good place to start.

            • 3. Re: Start an MBean in another server
              jaleyba

               

              "dimitris@jboss.org" wrote:
              The first thing is to get remote jmx access to the other server, so you need to lookup the *other* server jmx/rmi adapter in the *other* server jndi.

              Then it depends how you have developed your application. If the mbean classes are available on the other server you could programmatically instantiate and start a service.

              The http://www.jboss.org/wiki/Wiki.jsp?page=FAQJBossJMX is a good place to start.


              Thanks

              J



              • 4. Re: Start an MBean in another server
                jaleyba

                Well, after read docs I did the following:


                First I did an interface:

                public interface ActiveMQNetworkMBean {
                
                 public void setPropertiesResource( String propertiesResource );
                
                 public String getPropertiesResource();
                
                 public void start() throws Exception;
                
                 public void stop() throws Exception;
                
                 public void startSlave() throws Exception;
                
                 public void stopSlave() throws Exception;
                
                 public String myTestAction() throws Exception;
                
                 Object invoke(org.jboss.invocation.Invocation mi) throws Exception;
                }
                
                




                Then I did the implementation:

                
                public class ActiveMQNetwork implements ActiveMQNetworkMBean {
                 private String propertiesResource;
                 private BrokerService service = null;
                 private BrokerService serviceSlave = null;
                 private boolean started = false;
                 private boolean startedSlave = false;
                 private static Logger log = Logger.getLogger(ActiveMQNetwork.class);
                
                
                 /**
                 * Returns current propertie resource or null if wasn't
                 * yet configured.
                 *
                 * @return string with propertie resource.
                 */
                 public String getPropertiesResource() {
                 return this.propertiesResource;
                 }
                
                
                 /**
                 * Set properties Resource.
                 *
                 * @param propertiesResource
                 */
                 public void setPropertiesResource(String propertiesResource) {
                 this.propertiesResource = propertiesResource;
                 }
                
                
                 /**
                 * Start service.
                 *
                 * @throws Exception
                 */
                 public void start() throws Exception {
                 started = true;
                 log.info("BROKER SERVICE: Starting ActiveMQNetwork ... " + propertiesResource);
                 createNetwork();
                 }
                
                 /**
                 * Stop service.
                 *
                 * @throws Exception
                 */
                 public void stop() throws Exception {
                 started = false;
                 log.info("BROKER SERVICE: Stoping ActiveMQNetwork ...");
                 if (service != null) {
                 service.stop();
                 service = null;
                 }
                 // do what you want ...
                 }
                
                 /**
                 * Create a broker.
                 *
                 * Configuration will be read from a file.
                 */
                 private void createNetwork() {
                 log.info("BROKER SERVICE: trying to crete broker");
                
                 try {
                 URI brokerURI = new URI("xbean:" + System.getProperty("jboss.server.config.url") + "activemq_master.xml");
                 service = BrokerFactory.createBroker(brokerURI);
                 if (service != null) {
                 service.start();
                 }
                 } catch (Exception e) {
                 log.error("BROKER SERVICE: createNetwork Exception: " + e.getMessage());
                 e.printStackTrace();
                 }
                 }
                
                 /**
                 * Start service.
                 *
                 * @throws Exception
                 */
                 public void startSlave() throws Exception {
                 startedSlave = true;
                 log.info("BROKER SERVICE: Starting ActiveMQNetwork Slave Broker... ");
                 createNetworkSlave();
                 }
                
                 /**
                 * Stop service.
                 *
                 * @throws Exception
                 */
                 public void stopSlave() throws Exception {
                 startedSlave = false;
                 log.info("BROKER SERVICE: Stoping ActiveMQNetwork Slave Broker...");
                 if (serviceSlave != null) {
                 serviceSlave.stop();
                 serviceSlave = null;
                 }
                 // do what you want ...
                 }
                
                 /**
                 * Create a broker.
                 *
                 * Configuration will be read from a file.
                 */
                 private void createNetworkSlave() {
                 log.info("BROKER SERVICE: trying to crete broker slave");
                
                 try {
                 URI brokerURI = new URI("xbean:" + System.getProperty("jboss.server.config.url") + "activemq_slave.xml");
                 serviceSlave = BrokerFactory.createBroker(brokerURI);
                 if (serviceSlave != null) {
                 serviceSlave.start();
                 }
                 } catch (Exception e) {
                 log.error("BROKER SERVICE: createNetwork Slave Exception: " + e.getMessage());
                 e.printStackTrace();
                 }
                 }
                
                 public String myTestAction() {
                 return "MyAction";
                 }
                
                
                 public Object invoke(Invocation mi) throws Exception {
                 log.info("BROKER SERVICE: MyService.invoke> method=" + mi.getMethod().getName());
                 return "invoke";
                 }
                
                }
                
                
                



                I deployed this service as sar file with the follown jboss-service.xml


                <mbean code="com.bs.activemq.mbean.service.ActiveMQNetwork"
                 name="jms.ActiveMQ:service=ActiveMQNetwork">
                 <depends>jboss:service=Naming</depends>
                 </mbean>
                
                 <!-- Proxy factory for MyService that will call target method on the target service -->
                 <mbean code="org.jboss.invocation.jrmp.server.JRMPProxyFactory"
                 name="jboss.jmx:type=adaptor,name=MyServiceInvokeTarget,protocol=jrmp,service=proxyFactory">
                 <!-- Use the standard JRMPInvoker from conf/jboss-service.xxml -->
                 <depends optional-attribute-name="InvokerName">jboss:service=invoker,type=jrmp</depends>
                 <!-- The target MBean -->
                 <depends optional-attribute-name="TargetName">jms.ActiveMQ:service=ActiveMQNetwork</depends>
                 <!-- Where to bind the proxy factory -->
                 <attribute name="JndiName">ActiveMQNetworkInvokeTarget</attribute>
                 <!-- Invoke target method instead of invoke(Invocation mi) -->
                 <attribute name="InvokeTargetMethod">true</attribute>
                 <!-- Comma-separated list of exported interfaces -->
                 <attribute name="ExportedInterfaces">com.bs.activemq.mbean.service.ActiveMQNetworkMBean</attribute>
                 <!-- client-side interceptors -->
                 <attribute name="ClientInterceptors">
                 <interceptors>
                 <interceptor>org.jboss.proxy.ClientMethodInterceptor</interceptor>
                 <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
                 <interceptor>org.jboss.jmx.connector.invoker.client.InvokerAdaptorClientInterceptor</interceptor>
                 <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
                 </interceptors>
                 </attribute>
                 </mbean>
                
                




                Then I did a client that work as follows:

                
                
                
                
                 public static void main(String[] args) {
                 try {
                 Hashtable env = new Hashtable();
                 env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
                 env.put("java.naming.provider.url", "jnp://172.31.112.9:1099");
                 //env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
                 env.put("java.naming.factory.url.pkgs", "org.jnp.interfaces");
                
                 InitialContext ic = new InitialContext(env);
                 ActiveMQNetworkMBean myService = (ActiveMQNetworkMBean) ic.lookup("ActiveMQNetworkInvokeTarget");
                 String res = myService.myTestAction();
                
                
                 } catch(Exception e) {
                 e.printStackTrace();
                 }
                
                




                But when I run the client I get the message:

                javax.naming.CommunicationException [Root exception is java.io.InvalidClassException: org.jboss.invocation.InvokerInterceptor; unable to create instance]
                 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:707)
                 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
                 at javax.naming.InitialContext.lookup(InitialContext.java:347)
                 at com.bs.activemq.mbean.service.Test.main(Test.java:23)
                 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
                 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
                 at java.lang.reflect.Method.invoke(Method.java:324)
                 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
                Caused by: java.io.InvalidClassException: org.jboss.invocation.InvokerInterceptor; unable to create instance
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1633)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1810)
                 at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1698)
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
                 at org.jboss.proxy.Interceptor.readExternal(Interceptor.java:66)
                 at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1686)
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
                 at org.jboss.proxy.Interceptor.readExternal(Interceptor.java:66)
                 at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1686)
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
                 at org.jboss.proxy.ClientContainer.readExternal(ClientContainer.java:142)
                 at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1686)
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1644)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
                 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
                 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
                 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
                 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
                 at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
                 at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:57)
                 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:637)
                 ... 8 more
                



                I really don't know what am I doing wrong.

                Could please somebody help me ?


                Thanks in advance

                J