ExampleHelloWorldService

A Hello World Service

 

This is a simple example of a JBoss Service. It lets you configure a message, which it prints out at start/stop. There is also a printMessage() operation and the message is configurable as an attribute.

 

The Management Interface

 

The key things are to extend

ServiceMBean

and define our management interface.

 

package com.acme;

import org.jboss.system.ServiceMBean;

public interface HelloWorldServiceMBean extends ServiceMBean
{
   // Configure getters and setters for the message attribute
   String getMessage();
   void setMessage(String message);
   
   // The print message operation
   void printMessage();
}

 

The Service Implementation

 

Now we have to implement our management interface and the start/stop example lifecyle.

We must implement our management according to the jmx spec and we extend

ServiceMBeanSupport

to do the heavy lifting.

 

package com.acme;

import org.jboss.system.ServiceMBeanSupport;

public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean
{
   // Our message attribute
   private String message = "Sorry no message today";

   // Getters and Setters
   public String getMessage()
   {
      return message;
   }
   public void setMessage(String message)
   {
      this.message = message;
   }

   // The printMessage operation
   public void printMessage()
   {
      log.info(message);
   }

   // The lifecycle
   protected void startService() throws Exception
   {
      log.info("Starting with message=" + message);
   }
   protected void stopService() throws Exception
   {
      log.info("Stopping with message=" + message);
   }
}

 

The deployment descriptor (jboss-service.xml)

 

<?xml version="1.0" encoding="UTF-8"?>

<server>
  <mbean code="com.acme.HelloWorldService" name="acme.com:service=HelloWorld">
    <attribute name="Message">Hello World</attribute>
  </mbean>
</server>

 

Now create a sar for your service

 

This is a jar file or directory (called hello-world.sar in this example) with the following

structure:

hello-world.sar
hello-world.sar/META-INF/jboss-service.xml
hello-world.sar/com/acme/HelloWorldService.class
hello-world.sar/com/acme/HelloWorldServiceMBean.class

 

The attachment ant project

 

Attached you will find an Ant project to run the example.

 

You need to change

build.properties

to point at your JBoss distribution.

 

Type "

ant deploy

" to deploy the mbean, you should see the following on the JBoss console:

02:07:39,938 INFO  [HelloWorldService] Starting with message=Hello World

 

Type "

ant undeploy

" to undeploy the mbean.

02:08:05,170 INFO  [HelloWorldService] Stopping with message=Hello World

 

Redeploy the mbean then go to http://localhost:8080/jmx-console. Find

acme.com:service=HelloWorld

and click on it. Change the message attribute to say Goodbye and click Apply Changes. Now click the invoke for the printMessage operation you will see the following output on the console:

02:08:47,256 INFO  [HelloWorldService] Goodbye

 

How about not extending a JBoss baseclass/interface?

 

It is not a requirement that your service extends JBoss specific baseclasses/interfaces, rather a convenience. JBoss treats all service deployments the same as long as they follow the JMX specification.

 

In the example below we have modified the example to remove those dependencies so the management interface looks like:

package com.acme;

public interface HelloWorldServiceMBean
{
   // Configure getters and setters for the message attribute
   String getMessage();
   void setMessage(String message);
   
   // The print message operation
   void printMessage();
   
   // Lifecycle callbacks
   void start() throws Exception;
   void stop();
}

We removed the extension of the ServiceMBean interface. Note that we need to add the start()/stop() methods if we want to receive lifecycle callbacks, but this is optional. If JBoss detects those methods on the MBean interface it will call them at the appropriate time. We could also have create()/destroy() methods if we need to fully participage in the JBoss lifecycle model.

 

The implementation class now becomes:

package com.acme;

public class HelloWorldService implements HelloWorldServiceMBean
{
   // Our message attribute
   private String message = "Sorry no message today";

   // Getters and Setters
   public String getMessage()
   {
      return message;
   }
   
   public void setMessage(String message)
   {
      this.message = message;
   }

   // The printMessage operation
   public void printMessage()
   {
      System.out.println(message);
   }

   // The lifecycle
   public void start() throws Exception
   {
      System.out.println("Starting with message=" + message);
   }
   
   public void stop()
   {
      System.out.println("Stopping with message=" + message);
   }
}

We have removed the ServiceMBeanSupport extension and we log directly to the standard output since the baseclass logger is not available. startService() and stopService() became start() and stop() correspondingly since we now deal directly with the lifecycle callbacks, rather than letting the ServiceMBeanSupport baseclass implement them and delegate to our implementation.

 

The attached hellombean2.zip file contains the sources for the modified example that removes the JBoss class/interface dependency.

 

Related

 

 

Referenced by: