...
Geronimo is a system framework that can be used to build a variety of tailored infrastructure services, with GBean providing it with a loosely-coupled and configurable runtime environments. GBean is an implementation of Inversion of Control (IoC), or the dependency injection, which allows the automatic injection of references as they become available. This tutorial is organized as follows:
...
Geronimo Kernel and GBean
...
- The
doStart()
method is used to start the GBean, and implement the GBean operations. It should not be used when the GBean is in a failed state. - The
doFail()
method is executed when the GBean fails to start, run or stop. It marks the GBean as failed, and always calls doStop() to stop it. - The
doStop()
menthods stops the GBean. javaCode Block java package org.apache.geronimo.gbean; public interface GBeanLifecycle{ void doStart() throws Exception; void doStop() throws Exception; void doFail(); } If the optional interface GBeanLifecycle is implemented, the implementation will get lifecycle callbacks from the kernel.
...
The sample GBean SimpleServerGBean simply starts a socket on the Geronimo server, and retrieves the name of the GBean and the socket port. The following code snippet implements the Plain Old Java Object (POJO) section:
...
In the following code snippet, the GBean exposes its attributes, operations, interfaces and constructor for the GBEAN_INFO static initializer.
...
The SimpleServerGBean Gbean is simple to start up and shutdown. During startup, it simply accepts an incoming socket connection requests, and sends out the echo message. When being stopped, the GBean closes the resouces that it consumes.
...
...
For this sample, we still need a class to test the SimpleServerGBean. This section creates a socket and sends a connection request to the SimpleServerGBean. After the connection has been established, it sends out messages and retrieves the echo message from the simpleServerGBean server instance.
...
Before deploying your GBean, you still have to compile the GBean class and build a proper .jar file. Maven is used to build Geronimo, so it can be used to build your GBean project. You have to write a pom.xml
file. See Maven website for more information about the file.
...
In the POM file above,
- The only dependency you need to develop a GBean is
Code Block xml xml<dependency> <groupId>org.apache.geronimo.framework</groupId> <artifactId>geronimo-kernel</artifactId> <version>2.1.3</version> </dependency> - We add following section to the POM only for the sake of the testing code.
xmlCode Block xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
Deploying the GBean
Follow these steps to deploy your GBean to Geronimo.
- Deploy the GBean package. There are two methods to deploy a GBean package to Geronimo.
- Deploy the .jar to the server via the JAR repository portlet in Geronimo administrative console. For example, you can deploy the SimpleServerGBean with the following information:
- GroupId: org.apache.geronimo.sample
- ArtifactId: simpleServer
- Version: 1.0
- Type: jar
- Mannually copy the jar file to the GERONIMO_HOME/repository with a path and package name rule.
- Path :
GroupId/ArtifactId/Version/ArtifactId-Version.Type
- Sample:
<GERONIMO_HOME>/repository/org/apache/geronimo/sample/simpleServer/1.0/simpleServer-1.0.jar
Note: If the GBean depends on an external library, you have to deploy both .jars into the repository, and list both of them in the <dependencies> section of the deployment plan described below.
- Path :
- Deploy the .jar to the server via the JAR repository portlet in Geronimo administrative console. For example, you can deploy the SimpleServerGBean with the following information:
- The next step is to develop a GBean deployment plan. A deployment plan is to define a Geronimo module as an .xml file that includes the descriptions of one or more instances of exsiting GBeans.
Code Block xml xmltitle simpleServer_deployment_plan.xml<?xml version="1.0" encoding="UTF-8"?> <module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2"> <environment> <moduleId> <groupId>org.apache.geronimo.sample</groupId> <artifactId>simpleServerModule</artifactId> <version>1.0</version> <type>car</type> </moduleId> <dependencies> <dependency> <groupId>org.apache.geronimo.sample</ groupId>groupId> <artifactId>simpleServer</artifactId> <version>1.0</version> </dependency> </dependencies> <hidden-classes /> <non-overridable-classes /> </environment> <gbean name="echoserver" class="org.apache.geronimo.sample.SimpleServerGBean"> <attribute name="port">7777</attribute> <attribute name="gbeanName">simpleServer</attribute> </gbean> </module> Let's briefly go through this plan.- The <moduleId> element is used to provide the configuration name for the module as deployed in the Geronimo server. It contains elements for the groupId, artifactId, version and type. Module IDs are normally printed with slashes between the four components, such as
GroupID/ArtifactID/Version/Type
. In this example, The module ID will beorg.apache.geronimo.sample/simpleServer/1.0/car
. - The <dependencies> element is used to provide the configurations on which the module is dependent upon. In this example, the module is dependent on
org.apache.geronimo.sample/simpleServer/1.0
.
- The <moduleId> element is used to provide the configuration name for the module as deployed in the Geronimo server. It contains elements for the groupId, artifactId, version and type. Module IDs are normally printed with slashes between the four components, such as
- Deploy the deployment plan to the server. There are two methods to deploy a GBean Module with a plan to Geronimo.
- If success, you can visit http://localhost:7777 and will get an echo from the server.
...
Other GBeans can be used in a GBean by injecting Reference methods. For instance, the GBean SimpleServerGBean can make use of another GBean named EchoMessageGBean with its POJO class and GBeanInfo implemented like the following:
...
This EchoMessageGBean does not implement GbeanLifecycle for simplicity. It only exposes an interface EchoMessageInterface which retrieves predefined echo messages.
...
- SimpleServerGBean now has more private members and a different constructor:
Code Block java javatitle Excerpt from SimpleServerGBean POJOprivate final String gbeanName; private int port; /* A new private member */ private EchoMessageInterface echo; private boolean started = false; private ServerSocket serversocket; /* Constructor changed */ public SimpleServerGBean(String gbeanName, int port, EchoMessageInterface echomsg) { this.gbeanName= gbeanName; this.port = port; this.echo= echomsg; } - In doStart() of the SimpleServerGBean implementation, we now retrieves messages from EchoMessageGBean and reorganizes the reponse message:
Code Block java javatitle Excerpt from SimpleServerGBean doStart()String appendMessage = echo.getEchoMessage(); String responseMessage = appendMessage + bufferedReader.readLine(); - Add a Reference method to GBeanInfo:
Code Block java javatitle SimpleServerGBean GBeanInfoprivate static final GBeanInfo GBEAN_ INFO; static { GBeanInfoBuilder infoFactory = new GBeanInfoBuilder(INFO; static { GBeanInfoBuilder infoFactory = new GBeanInfoBuilder( SimpleServerGBean.class.getName(), SimpleServerGBean.class); infoFactory.addAttribute("gbeanName", String.class, false); infoFactory.addAttribute("port", int.class, true); infoFactory.addOperation("isStarted", "String"); infoFactory.addInterface(InterfaceNamed.class); /* Add a reference */ infoFactory.addReference("echoMessenger",EchoMessageInterface.class );); /* A different constructor */ infoFactory.setConstructor(new String[] { "gbeanName", "port", "echoMessenger"}); GBEAN_INFO = infoFactory.getBeanInfo(); } - Correspondingly, the dployment plan for SimpleServerGBean has to be modified.
Code Block xml xmltitle Excerpt from simpleServer_deployment_plan.xml<gbean name="echoserver" class="org.apache.geronimo.sample.SimpleServerGBean"> <attribute name="port">7777</attribute> <attribute name="gbeanName">simpleServer</attribute> <reference name="echoMessenger"> <name>msgAppender</ name>name> </reference> </gbean> <gbean name="msgAppender" class="org.apache.geronimo.sample.EchoMessageGBean"> <attribute gbeanName="msg">[Echo from server]:</attribute> </gbean> After we add the .jar file to the server, and deploy the plan, the test class which initiates a socket on port 7777 will get a reponse message from the server.No Format nopanel true[Echo from server]: Hello simple server
The GBean SimpleServerGBean can reference different instances of EchoMessageGBean. For instance, the SimpleServerGBean listens on port 7778 instead, and gets messages from the instance msgAppender2.
...
...
When we deploy this plan (The .jar file does not have to be changed), the test class which starts a socket on port 7778 will gets the reponse from server 2. No Format
Geronimo Bootstrap
When Geronimo starts, the <GERONIMO_HOME>/bin/server.jar
is executed with org.apache.geronimo.cli.daemon.DaemonCLI
as the main class. This will boot the Geronimo kernel, and load initial GBeans from module j2ee-system-2.1.3.car
into the kenel.