Exercise 15.1: EJB Interceptors




Exercise 15.1: EJB Interceptors

This exercise implements the profiling interceptor shown in Chapter 15. The @javax.interceptor.Interceptors annotation is applied to the TravelAgent EJB's bookPassage( ) method to show method-level interception.

Start Up JBoss

If you already have JBoss running, there is no reason to restart it. Otherwise, start it up as instructed in Chapter 15.

Initialize the Database

The database tables will be created when Exercise 15.1 is deployed to JBoss. If you have problems running this example, shut down JBoss and run the clean.db Ant task.

Build and Deploy the Example Programs

Perform the following steps:

  1. Open a command prompt or shell terminal and change to the ex15_1 directory created by the extraction process.

  2. Set the JAVA_HOME and JBOSS_HOME environment variables to point to where your JDK and JBoss 4.0 are installed. Examples:


    Windows:

    C:\workbook\ex15_1> set JAVA_HOME=C:\jdk1.5.0
    C:\workbook\ex15_1> set JBOSS_HOME=C:\jboss-4.0.x
    


    Unix:

    $ export JAVA_HOME=/usr/local/jdk1.5.0
    $ export JBOSS_HOME=/usr/local/jboss-4.0
    

  3. Add ant to your execution path. Ant is the build utility.


    Windows:

    C:\workbook\ex15_1> set PATH=..\ant\bin;%PATH%
    


    Unix:

    $ export PATH=../ant/bin:$PATH
    

  4. Perform the build by typing ant.

As in the exercises in earlier chapters of this workbook, titan.jar is rebuilt, copied to the JBoss deploy directory, and redeployed by the application server.

Examine the Code

This example extends the command-line-driven Titan Reservation console application in Exercise 11.4 in Workbook 9. The interceptor class we will apply to the TravelAgent EJB is an exact copy of the Profiler interceptor class described in Chapter 15 of the EJB book. We will not cover this code. The TRavelAgentBean class has been modified to apply the Profiler interceptor to the bookPassage( ) method:

package com.titan.travelagent;

import com.titan.processpayment.*;
import com.titan.domain.*;
import javax.ejb.*;
import javax.persistence.*;
import javax.annotation.EJB;
import java.util.Date;

@Stateful
public class TravelAgentBean implements TravelAgentRemote {
...

    @Remove
    @Interceptors(com.titan.interceptors.Profiler.class)
    public TicketDO bookPassage(CreditCardDO card, double price)
        throws IncompleteConversationalState {

        if (customer == null || cruise == null || cabin == null)
        {
            throw new IncompleteConversationalState( );
        }
        try {
            Reservation reservation = new Reservation(
                                  customer, cruise, cabin, price, new Date( ));
            entityManager.persist(reservation);

            processPayment.byCredit(customer, card, price);

            TicketDO ticket = new TicketDO(customer, cruise, cabin, price);
            return ticket;
        } catch(Exception e) {
            throw new EJBException(e);
        }
    }

Run the Application

Run the TravelAgentShell application by invoking Shell.bat or the Shell.sh script at the command prompt. Remember to set your JBOSS_HOME and PATH environment variables. Interact with the Titan Cruises reservation system as you did in Exercise 11.4 in Workbook 9:

> book 4444444444444444 11/1/06 550.0
Bill Burke has been booked for the Alaskan Cruise cruise on ship Queen Mary.
 Your accommodations include Queen Cabin 1 a 1 bed cabin on deck level 1.
 Total charge = 550.0

After you have booked a reservation, look at the JBoss console. You will see that the Profiler interceptor has timed the bookPassage( ) method and output it to the screen:

12:27:29,750 INFO  [STDOUT] Method public
com.titan.travelagent.TicketDO com.titan.travelagent.TravelAgentBean.bookPassa
ge(com.titan.processpayment.CreditCardDO,double) throws
com.titan.travelagent.IncompleteConversationalState took 16 (ms)