This chapter is dedicated to advanced JOnAS users who need some "external" services to be run together with the EJB server. A service is something that may be initialized, started and stopped. JOnAS itself already defines a set of services, some of them being cornerstones of the EJB Server. The JOnAS pre-defined services are the Registry, Tomcat Service, Jetty Service,Transaction Manager, the Security Manager, the Database Service, the JMS Service, the Ejb Service, the JMX Service and the Mail Service, all of them being used by most of the EJB applications.
Some EJB application developers may need to access other services for their components. Examples of such services are another Web container, a Versant container, ... Thus, it is important that such services could be run together with the EJB server. To achieve that, you have the possibility to define it as a JOnAS service.
This chapter describes how to define a new JOnAS service, and how to specify which service should be started with the EJB server.
The main principle for defining a new JOnAS service is to encapsulate it in a class whose interface is well known by JOnAS. More precisely, such a class allows to initialize, start and stop the service. Then you should make JOnAS aware of such a service by modifying the jonas.properties file.
A JOnAS service is represented by a class that implements the interface
org.objectweb.jonas.service.Service
, and thus should
implement the following methods
public void init(Context ctx) throws ServiceException;
public void start() throws ServiceException;
public void stop() throws ServiceException;
public boolean isStarted();
public String getName();
public void setName(String name);
It should also define a public constructor with no argument.
These methods will be called by JOnAS for initializing, starting and
stopping the service. Configuration parameters are provided to the
initialisation method through a naming context. This naming context
is built from properties defined in the jonas.properties
file
as explained in the section below.
The Service class should look like the following:
package a.b; import java.naming.Context; import java.naming.NamingException; import org.objectweb.jonas.service.Service; import org.objectweb.jonas.service.ServiceException; ..... public class MyService implements Service { private String name = null; private boolean started = false; ..... public void init(Context ctx) throws ServiceException { try { String p1 = ctx.lookup("p1"); ..... } catch (NamingException e) { throw new ServiceException("....", e); } ..... } public void start() throws ServiceException { ..... this.started = true; } public void stop() throws ServiceException { if (this.started) { this.started = false; ..... } } public boolean isStarted() { return this.started; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
In the jonas.properties
file, you should define your service and
specify its initialization parameters. The first step is to choose
a name for the service (e.g. "serv1"), and then
jonas.services
property: this property
defines the set of services (comma separated) that will be started
with JOnAS, in the order of this list.jonas.service.serv1.class
property specifying the service
class.jonas.service.serv1.XXX
properties specifying the
service initialization parameters, that will be made available
to the service class via the Context argument of the init
method.This is illustrated below:
jonas.services .......,serv1 jonas.service.serv1.class a.b.MyService jonas.service.serv1.p1 value
jonas.properties
.
With this name, it is possible to get a reference on the service implementation
class by using the ServiceManager method: getService(name)
.
Here after is an example of accessing a Service:
import org.objectweb.jonas.service.ServiceException; import org.objectweb.jonas.service.ServiceManager; MyService sv = null; // Get a reference on MyService. try { sv = (MyService) ServiceManager.getInstance().getService("serv1"); } catch (ServiceException e) { Trace.errln("Cannot find MyService:"+e); }
The reader may refer to the JOnAS sources for more details about the classes mentionned in this section.
The JOnAS existing services are the following:
Service name | Service class |
registry | RegistryServiceImpl |
ejb | EJBServiceImpl |
web | CatalinaJWebContainerServiceImpl / JettyJWebContainerServiceImpl |
ear | EarServiceImpl |
dbm | DataBaseServiceImpl |
jms | JmsServiceImpl |
jmx | JmxServiceImpl |
jtm | TransactionServiceImpl |
MailServiceImpl | |
resource | ResourceServiceImpl |
security | JonasSecurityServiceImpl |
If you need all these services they will be launched in the following order:
registry, jmx, security, jtm, dbm, mail, jms, resource, ejb, web, ear.
jmx, security, dbm, mail, resource are optional when you are using service ejb.
registry must be launched first.
(Note that for compatibility reasons with
previous version of JOnAS if you forget to set registry as first service to launch,
JOnAS will automatically launch the registry service.
A jonas.properties
file now looks like the following:
..... ..... jonas.services registry,jmx,security,jtm,dbm,mail,jms,ejb,resource,serv1 jonas.service.registry.class org.objectweb.jonas.registry.RegistryServiceImpl jonas.service.registry.mode automatic jonas.service.dbm.class org.objectweb.jonas.dbm.DataBaseServiceImpl jonas.service.dbm.datasources Oracle1 jonas.service.ejb.class org.objectweb.jonas.container.EJBServiceImpl jonas.service.ejb.descriptors ejb-jar.jar jonas.service.ejb.parsingwithvalidation true jonas.service.ejb.mdbthreadpoolsize 10 jonas.service.web.class org.objectweb.jonas.web.catalina.CatalinaJWebContainerServiceImpl jonas.service.web.descriptors war.war jonas.service.web.parsingwithvalidation true jonas.service.ear.class org.objectweb.jonas.ear.EarServiceImpl jonas.service.ear.descriptors j2ee-application.ear jonas.service.ear.parsingwithvalidation true jonas.service.jms.class org.objectweb.jonas.jms.JmsServiceImpl jonas.service.jms.mom org.objectweb.jonas_jms.JmsAdminForJoram jonas.service.jms.collocated true jonas.service.jms.url joram://localhost:16010 jonas.service.jmx.class org.objectweb.jonas.jmx.JmxServiceImpl jonas.service.jtm.class org.objectweb.jonas.jtm.TransactionServiceImpl jonas.service.jtm.remote false jonas.service.jtm.timeout 60 jonas.service.mail.class org.objectweb.jonas.mail.MailServiceImpl jonas.service.mail.factories MailSession1 jonas.service.security.class org.objectweb.jonas.security.JonasSecurityServiceImpl jonas.service.resource.class org.objectweb.jonas.resource.ResourceServiceImpl jonas.service.resource.resources MyRA jonas.service.serv1.class a.b.MyService jonas.service.serv1.p1 John
For the purpose of Services, the
org.objectweb.jonas.service.ServiceException
exception
is defined. Its type is java.lang.RuntimeException.
and it may encapsulate any java.lang.Throwable
.
The org.objectweb.jonas.service.ServiceManager
class
is responsible for creating, initializing and launching the services.
It may also return a service from its name and list all the services.