JettyPlus Transaction, Datasource and JNDI Test

Skip to the demo

Background to the demo

JettyPlus integrates a number of valuable J2EE features with the core Jetty server: UserTransactions, Datasources and JNDI lookups. This demonstration illustrates programmatic JNDI lookups of env and resource-env values specified in the web.xml descriptor, connecting to a a DataSource, and using UserTransactions to bracket increments to an integer value stored in the DataSource.

The demo's web.xml file contains the following environment entries:
 


<web-app>

  <!-- Set up the resource-env-ref for the DataSource -->

  <resource-env-ref>
    <description>
      DB Connection
    </description>
    <resource-env-ref-name>
      jdbc/myDB
    </resource-env-ref-name>
    <resource-env-ref-type>
      javax.sql.DataSource
    </resource-env-ref-type>
  </resource-env-ref>

  <!-- Set up a couple of env-entries  -->

  <env-entry>
    <env-entry-name>
       select
    </env-entry-name>
    <env-entry-value>
       select id, foo from testdata
    </env-entry-value>
    <env-entry-type>
       java.lang.String
    </env-entry-type>
  </env-entry>
  <env-entry>
    <env-entry-name>
       update
    </env-entry-name>
    <env-entry-value>
       update testdata set foo=? where id=1
    </env-entry-value>
    <env-entry-type>
       java.lang.String
    </env-entry-type>
  </env-entry>
</web-app>

Application web.xml descriptor


The relevant sections of the jetty xml configuration file are:
 


<!-- =============================================================== -->
<!-- Configure the JettyPlus Server                                  -->
<!-- =============================================================== -->

<Configure class="org.mortbay.jetty.plus.Server">


  <!-- =============================================================== -->
  <!-- Configure a Log4J log sink                                      -->
  <!-- =============================================================== -->

  <Call name="instance" class="org.mortbay.util.Log">
    <Call name="disableLog"/>
    <Call name="add">
      <Arg>
        <New class="org.mortbay.util.log4j.Log4jSink">
          <Call name="start"/>
        </New>
      </Arg>
    </Call>
  </Call>




  <!-- =============================================================== -->
  <!-- Add a transaction manager and datasources                       -->
  <!-- =============================================================== -->

  <Call name="addService">
    <Arg>
      <New class="org.mortbay.jetty.plus.JotmService">
        <Set name="Name">TransactionMgr</Set>
         <!-- set up a pooled DataSource -->
         <Call name="addPooledDataSource">
             <Arg>jdbc/myDB</Arg>   
             <!-- set up the datasource -->
             <Arg>
               
               <!-- Uncomment one of the following types of XADataSource        -->
               <!-- according to your type of database:                         -->
               <!-- New class="org.enhydra.jdbc.sybase.SybaseXADataSource"      -->
               <!-- New class="org.enhydra.jdbc.informix.InformixXADataSource"  -->
               <!-- New class="org.enhydra.jdbc.oracle.OracleXADataSource"      -->
               
               <New class="org.enhydra.jdbc.standard.StandardXADataSource">
                 <Set name="DriverName">org.hsqldb.jdbcDriver</Set>
                 <Set name="Url">jdbc:hsqldb:extra/etc/tmtest</Set>
                 <Set name="User">sa</Set>
                 <Set name="Password"></Set>
                 
                 <!-- Uncomment to setup isolation level as required            -->
                 
                 <!--
                 <Set name="TransactionIsolation"><Get class="java.sql.Connection" name="TRANSACTION_SERIALIZABLE"/></Set> 
                 -->
               </New>
             </Arg>
             <!-- set up a pool for the datasource -->
             <Arg>
               <New class="org.enhydra.jdbc.pool.StandardXAPoolDataSource">
                 <Arg type="Integer">4</Arg>          <!-- initial size of pool -->     
                 <Set name="MinSize">4</Set>                
                 <Set name="MaxSize">15</Set> 
                 <!-- Uncomment to setup other pool params as required          -->
                 <!--
                 <Set name="SleepTime">10</Set>
                 <Set name="LifeTime">10</Set>
                 <Set name="DeadLockMaxWait">10</Set>
                 <Set name="DeadLockRetryWait">10</Set>
                 <Set name="LoginTimeout">10</Set>
                 <Set name="Debug" type="boolean">true</Set>
                 -->
               </New>
             </Arg>               
        </Call>
     </New>
   </Arg>
  </Call>



 
</Configure>

jettyplus.xml configuration file

Notice particularly that it is the JettyPlus server class org.mortbay.jetty.plus.Server being configured, not the normal Jetty server (org.mortbay.jetty.Server).

Note also that a log4J log sink must be configured. You must specify the location of the log4j configuration file on the run line. For this demo, this is located in the org.mortbay.jetty.plus.resource.jar file, the source of which is in $jetty.home/extra/plus/resources/log4j.xml.

Now, you're ready to try the demo.