Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin


Running SPECjAppServer2004 benchmark on Geronimo

Still not a success, your help needed!

This article shows how to measure the performance of the Geronimo application server using the industry standard SPECjAppServer2004 benchmark.

Issues still exist that prevent SPECjAppServer2004 from running on Geronimo.

This article is not a success story, but a collection of notes on the progress that has been made in this direction.

Current issue that requires your help is: #Running the benchmark

Disclaimer: This article is created to write down the existing experience and to make it reproducible. It is not targeted to be a comprehensive guide on either product or on merging them together. It's not also a replacement to the products' documentation, but just a step-by-step guide on how to make things work in a simple configuration, as it worked for me. Make sure you at least look through the documentation on both products before you proceed.

SPECjAppServer is a trademark of the Standard Performance Evaluation Corp. (SPEC). The official web site for SPECjAppServer2004 is located at

SPECjAppServer2004 version 1.08 introduces a reduced workload called EAStress2004 that relaxes run and reporting rules, enabling informal results to be shared more easily in open-source research and development projects.

The EAStress2004 workload in SPECjAppServer2004 v1.08 can be used as a tool to optimize performance of products under development and to share results in public forums. Unlike SPECjAppServer2004 results, testing results from the EAStress2004 workload do not need to be reviewed by SPEC prior to being made public.

Results from the EAStress2004 workload cannot be used for marketing purposes, and comparisons to other SPECjAppServer2004 results are not permitted.

See full press release on SPECjAppServer2004/EAStress2004 v1.08 here:

All logs, stacks and result files in this article are extracted from EAStress2004 v1.08 runs.

This article is written for SPECjAppServer2004 v1.08 and Geronimo v2.1. For other versions some stages may be different. Older versions of this article for SPECjAppServer2004 v1.05 and older versions of Geronimo can be found here: v1.0, v1.1, v1.2, v2.0.2.

The described configuration uses as many Geronimo components as possible, including the built-in Derby database and the built-in Jetty or Tomcat servlet container. In fact, the configuration only uses Java, Geronimo, an external servlet container (e. g. Tomcat) and SPECjAppServer2004. To plug external components (most probably, a database), you have to change your configuration accordingly.

This configuration also assumes that all the components (except, possibly, the SPECjAppServer2004 Driver and the SPECjAppServer2004 Supplier Emulator and its servlet container) are run on the same machine. If you want to run the Distributed workload, your configuration will be different.

This configuration uses the Microsoft Windows XP Professional Service Pack 2 operating system, Cygwin shell, Sun Java SE 5.0 Update 11 and Tomcat v5.0.30 to write this article. If you use another OS, Java or servlet container, some stages may be different.

This article uses forward slashes ( / ) for command lines, adjust to backslashes ( \ ) accordingly if you use Windows command prompt.

This article has the following structure:

General information

About Geronimo

Geronimo is the Apache Software Foundation Java EE 5 certified application server. It is developed under Apache License and can be downloaded freely.

Apache site:

Product site:

Latest version, 2.1:

Release notes:

Documentation page:

The best document available is "Apache Geronimo: J2EE Development and Deployment" book by Aaron Mulder:

Other important resources are FAQ: and Wiki:

About SPECjAppServer2004/EAStress2004

SPECjAppServer2004 is a commercial benchmark for measuring the performance of Java EE application servers.

EAStress2004 is a reduced workload that is a part of SPECjAppServer2004 v1.08, it relaxes run and reporting rules, enabling informal results to be shared more easily in open-source research and development projects.

SPEC site:

Product site:

Press release on v1.08 and EAStress2004:


User's Guide:

Run and Reporting Rules:

Back to Top

Obtaining products

Obtaining Geronimo

The latest Geronimo version for now is 2.1.

General download page:

Two builds of Geronimo exist, with Jetty or Tomcat servlet container enabled by default. You can download either one at, they are around 80 MB in size each. This document was written primarily using Jetty version, but Tomcat version works fine also.

Obtaining SPECjAppServer2004

SPECjAppServer2004 costs $2000 ($250 for non-profit/educational purposes), you can order it online. See FAQ for details.

The latest version is 1.08, coming as the SPECjAppServer2004-Kit-v1.08.jar file, 12 MB in size.

Back to Top

Conventions and environment

This section contains important notions that mark the important hosts and directories.


This article is written in terms of the following machines:

  • – the machine where the SPECjAppServer2004 Driver is run. If you use configuration with multiple Drivers, you have to repeat all the operations for this host on all Driver hosts.
  • – the main, Master in configurations with multiple Drivers.

The and the may be the same machine.

The and the may be the same machine, moreover, the SPECjAppServer2004 Supplier Emulator may be deployed into a Geronimo built-in servlet container (Jetty or Tomcat).

The and the may be the same machine, but you have to adjust the Geronimo configuration, as both Geronimo and the SPECjAppServer2004 Driver create RMI Registry on the default port (1099) and would conflict on that.

Sharing with or is contradicting with the SPECjAppServer2004 documentation and would impact the performance severely and invalidate the benchmark results. However technically this is possible.


This section lists important directories that are further addressed in this article. They can be chosen arbitrary, but should not overlap.

  • <GERONIMO> – directory at the where Geronimo is installed.
  • <KIT> – directory at the containing the files attached to this article.
  • <TOMCAT> – directory at the where Tomcat is installed.
  • <DRIVER> – directory at the that is a copy of the <SPEC> directory.
  • <DRIVER_GERONIMO> – directory at the that is a copy of the <GERONIMO> directory.
  • <JAVA_HOME>JAVA_HOME location at the
  • <OUTPUT> – directory at the where the SPECjAppServer2004 Driver will store its output.
  • <DUMP> – directory at the where the SPECjAppServer2004 Driver will store its temporal files.

    On Windows some components may work incorrectly if working paths are too long or contain spaces. So it's recommended that you avoid long paths and spaces in them.

Back to Top

Installing products

First, save the files attached to this article to a local directory. This will be your <KIT> directory.

Installing Geronimo

You can easily install Geronimo using the .zip or .tar.gz archive.

Extract the downloaded archive to a local directory. The geronimo-jetty6-javaee5-2.1 or geronimo-tomcat6-javaee5-2.1 directory is created, that is your <GERONIMO> directory.

Installing SPECjAppServer2004



java -jar SPECjAppServer2004-Kit-v1.08.jar

Click Next, read and accept the license agreement, and type in the directory you want the SPECjAppServer2004 to be installed to. This directory will be your <SPEC> directory.

Click Install.

Wait until the installation completes, then click Ready.

Back to Top

Configuring Geronimo

Adjusting configuration

If your and your are the same machine, you have to adjust the port number of the Geronimo RMI Registry (to e. g. 1199), otherwise it would conflict with the SPECjAppServer2004 Driver that uses the default port of 1099. Edit the <GERONIMO>/var/config/ file and change the NamingPort variable value.

Starting Geronimo

Go to your <GERONIMO> directory.

Start Geronimo by typing:


java -Djava.endorsed.dirs=lib/endorsed -javaagent:bin/jpa.jar -Dopenejb.jndiname.failoncollision=true -Dopenejb.jndiname.format={ejbName} -jar bin/server.jar

Please note the two OpenEJB settings, they're necessary to tune Geronimo to the simple format of EJB JNDI names SPECjAppServer2004 uses.

See details at and

You may also use <GERONIMO>/bin/ or <GERONIMO>/bin/geronimo.bat scripts instead, after appropriate adjustments.

Geronimo v2.1 needs access to Internet for SPECjAppServer2004 application to be deployed – it tries to fetch XML schemas from site.

So if you're behind a firewall, add the appropriate proxy options to the Geronimo startup line:

-Dhttp.proxyHost=PROXY_HOST -Dhttp.proxyPort=PROXY_PORT -Dhttp.nonProxyHosts="|localhost||"

This problem is caused by OPENEJB-700 bug which is already fixed and the fix should make it to Geronimo v2.1.1.

If your installation of Geronimo has no access to Internet at all, or your proxy requires authentication, you may use the following workarounds (thanks to Konstantin Malynkin for describing them). You may download the necessary DTDs to your local drive and specify the local path to them in your deployment descriptors (see <SPEC>/src/deploy/geronimo directory). For example, you could use <!DOCTYPE ejb-jar SYSTEM "C:/DTD/ejb-jar_2_0.dtd"> instead of <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' ''>. Another way is to omit verification at all by deleting or commenting out the references to DTDs in the deployment descriptors. Note that in both cases you would have to rebuild and redeploy the SPECjAppServer2004 application for the changes to take effect.

It will take some time to start. After that, you will see:

blacksolid Booting Geronimo Kernel (in Java 1.5.0_11)... Starting Geronimo Application Server v2.1 [****************************************] 100% 25s Startup complete Listening on Ports: 0 Derby Connector 1050 CORBA Naming Service 1099 RMI Naming 2001 OpenEJB ORB Adapter 4201 OpenEJB Daemon 6882 OpenEJB ORB Adapter 8009 Jetty Connector AJP13 8080 Jetty SelectChannel Connector HTTP 8443 Jetty SelectChannel Connector HTTPS 9999 JMX Remoting Connector 61613 ActiveMQ Transport Connector 61616 ActiveMQ Transport Connector Started Application Modules: EAR: org.apache.geronimo.configs/uddi-jetty6/2.1/car EAR: org.apache.geronimo.plugins/agent/2.1/car EAR: org.apache.geronimo.plugins/console-jetty/2.1/car EAR: org.apache.geronimo.plugins/mconsole-jetty/2.1/car JAR: org.apache.geronimo.configs/mejb/2.1/car RAR: org.apache.geronimo.configs/activemq-ra/2.1/car RAR: org.apache.geronimo.configs/system-database/2.1/car RAR: org.apache.geronimo.plugins/agent-ds/2.1/car RAR: org.apache.geronimo.plugins/mconsole-ds/2.1/car WAR: org.apache.geronimo.configs/ca-helper-jetty/2.1/car WAR: org.apache.geronimo.configs/dojo-jetty6/2.1/car WAR: org.apache.geronimo.configs/dojo-legacy-jetty6/2.1/car WAR: org.apache.geronimo.configs/remote-deploy-jetty/2.1/car WAR: org.apache.geronimo.configs/welcome-jetty/2.1/car WAR: org.apache.geronimo.plugins/activemq-console-jetty/2.1/car WAR: org.apache.geronimo.plugins/debugviews-console-jetty/2.1/car WAR: org.apache.geronimo.plugins/plancreator-console-jetty/2.1/car WAR: org.apache.geronimo.plugins/plugin-console-jetty/2.1/car WAR: org.apache.geronimo.plugins/sysdb-console-jetty/2.1/car Web Applications: / /CAHelper /activemq /console /console-base /debug-views /dojo /dojo/0.4 /juddi /monitoring /plan-creator /plugin /remote-deploy /system-database Geronimo Application Server started

If you get a different result, particularly, if network errors show up, then something has gone wrong.

Sometimes, the startup fails because some local network addresses are inaccessible. This could happen, for example, if you have used a VPN interface that is disconnected now. By default, Geronimo uses the first local address it comes across to access its components, and may try to use a stale address, causing startup errors.

You may try disabling and then re-enabling the unused network interfaces to resolve such issues.

Accessing the console

Open your web browser and connect to the Geronimo Console at

Log in using the user name and password (system and manager by default).

Now you may investigate the console if you wish.

Creating the database

Go to the Embedded DB - DB Manager in the Console Navigation.

Create the benchmark database by typing its name (SPECDB) in the Create DB field and clicking Create.

Locating the SQL files

To create database tables, you can use the default SQL scripts provided in the <SPEC>/schema/sql directory. However, the directory includes five scripts, and they contain DROP TABLE commands that would fail if you try to execute them in the console when tables are not yet created.

Instead, it is recommended that you use the allTablesNoDrop.sql file, if you are creating the tables from scratch, or allTables.sql file if you want to drop and recreate the tables. Both files were created from the <SPEC>/schema/sql files by simple concatenation, allTablesNoDrop.sql also has DROP TABLE commands removed.

Creating the tables

Make sure SPECDB is selected in Use DB field and then copy-paste the SQL code to SQL Command/s frame. Click Run SQL button above it.

After a short delay, the frame will clear and the Result field below it will say SQL command/s successful. If not – check what you did wrong and try again.

If you use multiple SQL scripts, repeat the operations above for each of them.

Back to Top

Configuring SPECjAppServer2004

Basic configuration

deploy directory

Go to the <SPEC>/src/deploy directory and copy the reference subdirectory with its contents with the name geronimo.

geronimo.env file

Go to the <SPEC>/config directory.

Put the attached geronimo.env template file there. Edit it, make sure you set the values for the following variables:


Use forward slashes ( / ) as directory separators!

You may leave the other variables intact.

appsserver file

Edit the <SPEC>/config/appsserver file – replace the word default there with the word geronimo. file

Edit the <SPEC>/config/ file. Note that it will be used on the and make sure the following variables have correct values:

researchMode = true # Turns EAStress mode on
Url =
outDir = <OUTPUT>
dumpDir = <DUMP>

setenv.bat file

Edit the <SPEC>/bin/setenv.bat file, make sure you set the values for the following variables:


Building the application

Go to the <SPEC> directory.

Clean-up your installation:


ant/bin/ant clean

Build the application and configure it for Geronimo:


ant/bin/ant -Dappserver=geronimo

You will get the BUILD SUCCESSFUL diagnostic.

Make sure the files SPECjAppServer.ear and emulator.war are created in the <SPEC>/jars directory.

Rename emulator.war to Emulator.war.

Preparing database configuration

In the described configuration, the same database is used for all tables.

Go to the <SPEC>/config directory. Replace the content of each of the * files you find there with the contents of the attached template file. Make sure the pipeDir variable there points to a valid temporary directory, adjust if necessary.

Loading the tables



ant/bin/ant -Dappserver=geronimo loaddb

After some time, you will get the BUILD SUCCESSFUL diagnostic.

Back to Top

Deploying components

At this stage you need to deploy the configured components to Geronimo.

Note that if your and your are the same machine, and you changed the port number of the Geronimo RMI Registry, you should specify that port number in all deployer commands, like this:


java -jar bin/deployer.jar -port 1199 ...

Logging in

To avoid specifying login credentials on any call to deployer, you can login first:


java -jar bin/deployer.jar -u system -p manager login

Deploying database connector

To deploy a connector to the Derby SPECDB database you created earlier, go to the <GERONIMO> directory and run:


java -jar bin/deployer.jar deploy repository/org/tranql/tranql-connector-derby-embed-xa/1.3/tranql-connector-derby-embed-xa-1.3.rar <KIT>/sjas-db.xml

You will get the SPECjAppServer2004/DB/1.08/rar diagnostic.

Deploying JMS connector

To deploy an ActiveMQ JMS connector for SPECjAppServer2004, go to the <GERONIMO> directory and run:


java -jar bin/deployer.jar deploy repository/org/apache/geronimo/modules/geronimo-activemq-ra/2.1/geronimo-activemq-ra-2.1.rar <KIT>/sjas-jms.xml

You will get the SPECjAppServer2004/JMS/1.08/rar diagnostic.

Deploying the main application

To deploy SPECjAppServer2004 on Geronimo, this configuration uses the deployment plan that was originally found in Geronimo sources at, modified and updated for Geronimo version 2.1.

Go to the <GERONIMO> directory and run:


java -jar bin/deployer.jar deploy <SPEC>/jars/SPECjAppServer.ear <KIT>/sjas-app.xml

You will get the SPECjAppServer2004/Application/1.08/ear diagnostic.

Verifying the deployment

At this stage you may check that the deployment has been done correctly and that SPECjAppServer2004 is operational.

Delivery servlet

Go to the page It should load normally and contain a single directory, dtd, with two files inside, delivery.dtd and po.dtd.

Go to the page You should see a page with text like this:


Servlet seems to work OK
Number of Transactions : 0
Servlet invoked without command specified

Manual transactions

Open the deployed SPECjAppServer2004 page:

In the left-hand menu, click the Go Trade Autos! or Go Build Cars! link.

Log in with the default credentials (1) by clicking Log in.

You should see the program interface and be able to perform transactions.

Atomicity tests

Open the deployed SPECjAppServer2004 page:

In the left-hand menu, click the Atomicity Tests link.

You will see the results of three atomicity tests' runs. If all three of them are marked as PASSED, your deployment is correct.

Back to Top

Deploying the Supplier Emulator

To deploy the SPECjAppServer2004 Supplier Emulator at the, use one of the following:

The Geronimo built-in servlet container (in case the and the are the same machine); or a stand-alone servlet container on the

Note that SPECjAppServer2004 documentation requires that the Supplier Emulator servlet container should have the keep-alive option turned off. You can ignore this requirement, but that would impact the performance severely.

Using the Geronimo servlet container

Go to the <GERONIMO> directory and run:


java -jar bin/deployer.jar deploy <SPEC>/jars/Emulator.war <KIT>/sjas-emulator.xml

You will get the SPECjAppServer2004/Emulator/1.08/war @ /Emulator diagnostic.

Using a stand-alone servlet container

This configuration assumes that your stand-alone servlet container on the is Tomcat running on the default port (8080).

Install Tomcat to your <TOMCAT> directory on the

Do not bother editing <SPEC>/config/tomcat.env file or running ant/bin/ant -f tomcat.xml.

Both files are obsolete, they generate the Emulator.war file, which has already been created at #Building the application phase.

Copy the <SPEC>/jars/Emulator.war file to the <TOMCAT>/webapps directory and remove the <TOMCAT>/webapps/Emulator directory if it exists.

Go to the <TOMCAT> directory on the and start Tomcat:


bin/catalina run

Veryfying the deployment

Go to the page It should load normally and contain a single directory, dtd, with two files inside, delivery.dtd and po.dtd.

Go to the page You should see a page with text like this:


Emulator Servlet seems to work OK
JAS_PORT : 8080
Servlet URL : Supplier/DeliveryServlet

Number of Transactions : 0
Servlet invoked without command specified

Back to Top

Running the benchmark

Copy the <GERONIMO> directory to the, the copy will be your <DRIVER_GERONIMO> directory (in fact you only need some jars from it).

Copy the <SPEC> directory to the, the copy will be your <DRIVER> directory.

In the <DRIVER>/config/geronimo.env file adjust the JAS_HOME variable to the <DRIVER> directory and J2EE_HOME variable to the <DRIVER_GERONIMO> directory.

Go to the <DRIVER> directory on the and run:



This configures the environment to run the Driver.

To start the Driver itself, run:



If you wish to run a distributed load with multiple Drivers, then after the Driver is started on the first host (the, start the Driver on other driver hosts like this:



After starting the Driver, you should see the output like this:

blacksolid The following environment settings are in effect: * ========================= * JAVA_HOME=<JAVA_HOME> JAS_HOME=<DRIVER> CONFIG_DIR=<DRIVER>\config APPSSERVER=geronimo ENVFILE=<DRIVER>\config\geronimo.env * ========================= * Driver Host: <> This result was created using EAStress2004, a research workload utilizing a subset of the SPECjAppServer2004 benchmark with a unique metric. It is provided only as a tool for research testing and experimentation in situations where the benchmark run rules cannot be met due to technical reasons (e. g., usage of projects under development, usage of experimental platforms). EAStress2004 results are not reviewed by SPEC and can in no way be compared with SPECjAppServer2004 results. Because EAStress results are not compliant with the benchmark run rules, the use of EAStress results in competitive comparisons between vendors is prohibited. Public use of SPECjAppServer2004 benchmark results, including the EAStress workload, are bound by the SPEC OSSC Fair Use Guidelines and the SPECjAppServer2004 specific Run and Reporting Rules. All publications must clearly state that these results have not been reviewed or accepted by SPEC using text equivalent to this: SPECjAppServer is a trademark of the Standard Performance Evaluation Corp. (SPEC). The EAStress workload results or findings in this publication have not been reviewed or accepted by SPEC, therefore no comparison nor performance inference can be made against any published SPEC result. The official web site for SPECjAppServer2004 is located at Binding controller to //<>/Controller DriverDebug: DealerAgent <propsFile> <agentName> <masterMachine> Controller: Registering M1 on machine < IP address> Controller: Registering O1 on machine < IP address> Controller: Registering L1 on machine < IP address> Calling switchLog as master RunID for this run is : 75 Output directory for this run is : <OUTPUT>\75 TTF1 = 93 ttf = 93 Configuring 1 DealerAgent(s)... DealerAgent O1, Thread 0 started DealerAgent O1, Thread 1 started DealerAgent O1, Thread 2 started DealerAgent O1, Thread 3 started DealerAgent O1, Thread 4 started DealerAgent O1, Thread 5 started DealerAgent O1, Thread 6 started DealerAgent O1, Thread 7 started DealerAgent O1, Thread 8 started DealerAgent O1, Thread 9 started Configuring 1 MfgAgent(s)... MfgAgent M1, Thread 0 started MfgAgent M1, Thread 1 started MfgAgent M1, Thread 2 started Configuring 1 LargeOLAgent(s)... MfgAgent L1, Thread 0 started Rampup = Fri May 12 20:49:51 MSD 2006 SteadyState = Fri May 12 20:59:51 MSD 2006 Rampdown = Fri May 12 21:59:51 MSD 2006 Finish = Fri May 12 22:04:51 MSD 2006 sleeptime is 28417 note this is time in excess needed for trigger Starting Ramp Up...

This means the Driver started normally.

Note the times for Rampup, SteadyState, Rampdown and Finish to figure out the time needed for the benchmark to complete.

You can interrupt the run at any time with Ctrl-C.

Sometimes binding exceptions or other problems may occur at the Driver startup. In such a case, interrupt the test run with Ctrl-C and rerun it again. Sometimes it helps.

It's recommended to reload the database tables before each run, particularly if previous run was not finished correctly. Otherwise, errors like this may occur:

blacksolid java.rmi.RemoteException: Failure in calling validateInitialValues() java.rmi.RemoteException: Invalid initial Order DB State at org.spec.jappserver.driver.Auditor.validateInitialValues( at org.spec.jappserver.driver.Driver.configure( at org.spec.jappserver.driver.Driver.<init>( at org.spec.jappserver.driver.Driver.main(

During the run, the diagnostics like these may appear in the Driver output and Geronimo shell:

blacksolid AbstractSJASLoad> Application error have already been sold wrong format in chunk size field b=70 The transaction has been marked rollback only because the bean encountered a non-application exception: A lock could not be obtained due to a deadlock, cycle of locks and waiters is:

These diagnostics are probably caused by the fact that TranQL version 1.3 used in Geronimo v2.1 does not provide the necessary transaction isolation level. Hopefully, this problem will be fixed in future versions.

After the run has completed successfuly, you will see the output like this:

blacksolid Gathering DealerStats ... Gathering MfgStats ... summary file is <OUTPUT>\75\EAStress.summary EAStress2004 v1.08 Results EAStress2004 HASOPM: 0.574 Dealer Response Times Purchase...2.3000000000000003 Manage.....10.0 Browse.....4.0 Manufacturing Response Times Mfg........0.25 Calling getLog as master

The number of HASOPM is a final EAStress benchmark metric. You would get a JOPS result instead if you attempt a full SPECjAppServer2004 run.

For now these values for Geronimo are terribly low, and don't depend on the hardware being used. Probably this is due to some configuration issues that still exist or due to the TranQL issue mentioned above.

Back to Top

Processing results

When driver is run, a subdirectory with a numerical name is created in the <OUTPUT> directory. The subdirectory with the largest number corresponds to the latest run. After the Driver run is complete, the result.props file is created there, it contains the raw results from the benchmark.

Go to the <DRIVER>/reporter directory, copy the file Sample_Submission.txt under arbitraty name (e. g. Your_Submission.txt) and edit the copy, as described in SPECjAppServer2004 User's Guide :: Section 5 – Results, add the raw data from the result.props file.

Run the following command to generate an HTML benchmark report, it would be named


java -cp reporter.jar reporter Your_Submission.txt

Run the following command to generate a text-only benchmark report, it would be named


java -cp reporter.jar reporter -a Your_Submission.txt

For the details on how yo submit your results, see SPECjAppServer2004 User's Guide :: Section 5.3 – Submitting the Results

Back to Top