JBossWiki : ExampleHelloWorldService
Wiki Home: ExampleHelloWorldService [EN]
[Permalink]
[Recent Changes]
[History]
[RSS Feed][RDF Feed][Atom Feed][Print]

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:
CreateAStartupClass
ExampleMinimalNotificationListener
FAQJBossJMX
JBossFrequentlyAskedQuestions
JBossService
ListenerServiceMBeanSupport


Other languages:

Log in to make links between pages

Attachments:

http://wiki.jboss.org/wiki/_Files/ExampleHelloWorldService/hellombean.zip[History]
http://wiki.jboss.org/wiki/_Files/ExampleHelloWorldService/hellombean2.zip[History]

The page last changed on Wed Jun 13 09:57:15 EDT 2007 by damo9f