Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

In addition to the full workload, the application also contains a set of primitives used for functional and performance testing of various Java EE components and common design patterns.

This document is organized in the following sections:

Table of Contents
maxLevel3
minLevel2

Application Architecture

DayTrader is built on a core set of Java EE technologies that includes Java Servlets and JavaServer Pages (JSPs) for the presentation layer and Java database connectivity (JDBC), Java Message Service (JMS), Enterprise JavaBeans (EJBs) and Message-Driven Beans (MDBs) for the back-end business logic and persistence layer. The following diagram provides a high-level overview of the full workload application architecture.

...

The business logic and persistence layer form the bulk of the DayTrader application. The TradeServices interface defines the core set of business operations available in the application, such as register, login, getHoldings, buy, completeOrder, logout, etc. DayTrader provides three different implementations of these services, corresponding to three commonly used JavaEE application design patterns. These implementations are discussed below. Users can switch between these implemenations on the configuration page by changed the Runtime Mode.

Implementation

Details

TradeDirect
(Default)

Pattern: Servlet-to-JDBC
Runtime Mode: Direct

The TradeDirect class performs CRUD (create, read, update, and delete) operations directly agaist the supporting database using custom JDBC code. Database connections, commits, and rollbacks are managed manually in the code. JTA user transactions are used to coordinate 2-phase commmits.

TradeJDBC

Pattern: Servlet-to-SessionBean-to-JDBC
Runtime Mode: Session Direct

The TradeJDBC stateless session bean serves as a wrapper for TradeDirect. The session bean assumes control of all transaction management while TradeDirect remains responsible for handleing the JDBC operations and connections. This implementation reflects the most commonly used JavaEE application design pattern.

TradeBean

Pattern: Servlet-to-SessionBean-to-EntityBean
Runtime Mode: EJB

The TradeBean stateless session bean uses Caontainer Managed Persistence (CMP) entity beans to represent the business objects. The state of these objects is completely managed by the application servers EJB container.

Another subtle component of this layer involves the Java Messaging Service (JMS). JMS is used within DayTrader for two specific purposes, asynchronously processing buy/sell orders, and publishing quote price updates. The following table discusses these operations in further detail.

Operation

Details

Asynchrounous Order Processing

When a buy or sell operation is performed, an order request is placed on the TradeBroker JMS queue using a client connection. The TradeBrokerMDB consumes messages on this queue and completes the buy or sell operation.

Quote Price Updates

As stocks are traded, the associated quote prices are updated in the database and published to a JMS topic. The TradeStreamerMDB subscribes to these updates consuming the price updates messages, but does nothing more with them. The TradeStreamer JavaEE client that is bundled with DayTrader can be started to view the quote prices updates in real time.

...

As previously mentioned, all of the primary buisness operations provided by DayTrader are defined in the TradeServices interface. These operations are discussed further in the following table.

TradeServices Operation

Details

login

 

logout

 

buy

 

sell

 

getMarketSummary

 

queueOrder

 

completeOrder

 

cancelOrder

 

orderCompleted

 

getOrders

 

getClosedOrders

 

createQuote

 

getQuote

 

getAllQuotes

 

updateQuotePriceVolume

 

getHoldings

 

getHolding

 

getAccountData

 

getAccountProfileData

 

updateAccountProfile

 

register

 

resetTrade

 

...

The DayTrader JSP/Servlet-based web client provides a basic set of operations that one would expect to find in any stock trading and portfolio management application. These high level user operations trigger specific buisness operations (defined above) within the buisness logic and persistence layers to perform the desired task. The following table summarizes the buisness tasks performed by each user operation/action.

Client (UI) Operation

Flow of Buisness Operations

Register

 

Login

 

View Account

 

View Account Profile

 

Update Account Profile

 

View Portfolio

 

Sell Holding

 

View Quotes

 

Buy Stock

 

Logout

 

Getting the source and building Daytrader

Daytrader is available in the Apache's subversion repository, run the following command to checkout the source files into the daytrader-1.2 directory.

svn co http://svn.apache.org/repos/asf/geronimo/daytrader/branches/1.2/Image Added <daytrader_home>

<daytrader_home> could be any directory dedicated to hold daytrader-1.2.

This process may take several minutes depending on the machine and network connectivity speed.

Once all the sources get checked out the next step is to build Daytrader. From the <daytrader_home> directory run the following command.

mvn install

This process will take a couple of minutes. The binaries will be generated in the corresponding target directory for each of the modules in the modules directory.

Configuring Daytrader

  • cd /geronimo-tomcat-j2ee-1.2/bin
  • geronimo start
  • set GERONIMO_HOME=D:/geronimo-tomcat-j2ee-1.2
  • cd /daytrader-1.2/bin/dbscripts/derby
  • Open createDerbyDB script and verify/modify the Derby version to match the one being used by Geronimo ( e.g. <geronimo_home>/repository/org/apache/derby/derby/10.1.3.1 )
  • createDerbyDB
    D:\daytrader-1.2\bin\dbscripts\derby>createDerbyDB.bat
    "Invoking IJ command line tool to create the database and tables...please wait"
    ij version 10.1
    ij> ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'HOLDINGEJB' because it does not exist.
    ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'ACCOUNTPROFILEEJB' because it does not exist.
    ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'QUOTEEJB' because it does not exist.
    ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'KEYGENEJB' because it does not exist.
    ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'ACCOUNTEJB' because it does not exist.
    ij> ERROR 42Y55: 'DROP TABLE' cannot be performed on 'ORDEREJB' because it does not exist.
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> 0 rows inserted/updated/deleted
    ij> ij> Table creation complete
  • Point browser the Geronimo Administration Console and verify the database and tables have been created.
  • Update the \daytrader-1.2\plans\daytrader-1.2-beta-plan.xml . Replace "ge-activemq-rar/1.2-beta/rar" with "ge-activemq-rar/1.2/rar"
  • cd \geronimo-tomcat-j2ee-1.2\bin
  • deploy --user system --password manager deploy \daytrader-1.2\modules\ear\target\daytrader-ear-1.2-SNAPSHOT.ear \daytrader-1.2\plans\daytrader-1.2-beta-plan.xml
    Using GERONIMO_BASE: D:\geronimo-tomcat-j2ee-1.2
    Using GERONIMO_HOME: D:\geronimo-tomcat-j2ee-1.2
    Using GERONIMO_TMPDIR: D:\geronimo-tomcat-j2ee-1.2\var\temp
    Using JRE_HOME: C:\Java\jdk1.5.0_06\jre
    Deployed geronimo/daytrader/1.2-SNAPSHOT/car
    `-> web.war @ http://localhost:8080/daytraderImage Added
    `-> dt-ejb.jar
    `-> geronimo/daytrader-wsapp-client/1.2-SNAPSHOT/car
    `-> geronimo/daytrader-streamer-client/1.2-SNAPSHOT/car
    `-> TradeDataSource
    `-> TradeJMS

Daytrader is now ready for testing.

  • Access the application pointing your browser to http://localhost:8080/daytraderImage Added
  • Click on the Configuration tab.
  • Since we already created the database we can now proceed to populating data, click on (Re)-populate DayTrader Database to generate the sample data.