Disclaimer

The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

Wednesday, April 26, 2017

OpenNLP sentence detector and Oracle JDeveloper 12c

Oracle has released its chatbots application recently and I was curious about the technology behind chatbots in general. So I explored open source natural language processing framework OpenNLP and build a simple sentence detector application using my favourite IDE Oracle JDeveloper 12c.

Input/Output:
Here is my first OpenNLP project for sentence detection, for example given a string : How are you ? This is Mike, the output should detect two sentences : How are you ? and This is Mike.
By default OpenNLP does not support Bahasa language and I tried to create sample corpora for training.

For example : Apa kabar ? saya Elva , would have output : Apa kabar ? and saya Elva

Train model for Bahasa:
OpenNLP provides command line tool for training new model. To train new Bahasa sentence detector, use following command:

$ ./opennlp SentenceDetectorTrainer -model ../id-opennlp-models/id-sent.bin -lang id -data ../id-opennlp-models/id-train.sent -encoding UTF-8

This command will generate id-sent.bin as our model file and can be used in our project:

    public static void SentenceDetectIndo() throws InvalidFormatException,
                    IOException {
            String paragraph = "Apa Kabar? Saya Elva.";
            // always start with a model, a model is learned from training data
            InputStream is = new FileInputStream("id-sent.bin");
            SentenceModel model = new SentenceModel(is);
            SentenceDetectorME sdetector = new SentenceDetectorME(model);
   
            String sentences[] = sdetector.sentDetect(paragraph);
   
            System.out.println(sentences[0]);
            System.out.println(sentences[1]);
            is.close();
    }

Output:
Apa Kabar?
Saya Elva.

Conclusion:
OpenNLP is a powerful open source natural language processing framework, easy to use and allow us to train our own model using simple command line. In this project, I successfully create a simple sentence detector application, training my own Bahasa language model and use it to detect sentences in Bahasa.

Sample project file download here (sorry about big file size 57 MB, because the project includes complete required libraries and english models)


Sunday, January 1, 2017

Using ADF View Object to display huge datasets

Issue:
In some cases, we may have huge database table with million of records or more. Querying and displaying these records may slow down your web application if it is not coded efficiently.

Solution:
Using Oracle ADF View Object component, you can tune database query easily. If you need to display only certain number of records, you can use View Object tuning configuration and set number of row to display to UI. This will increase performance by reducing number of records need to be returned from database and displayed.

Example:
In ADF Model project, double click on View Object and go to General tab. You should see Tuning option like below.



Set "Only up to row number" to display "Top-N" entries in the page and avoiding database to return all the records from database.

Often you may want to use Query Optimizer Hint FIRST_ROWS that gives a hint to the database that you want to return the first rows as quick as possible rather than trying to optimize the retrieval of all records.





Friday, December 30, 2016

Using PL/SQL in Oracle ADF Web Application

Issue:
There are many common cases where we need to build process with intensive database operations which may involve thousands or more records. Building the logic in Java or ADF model layer will cause overhead in Java memory and garbage collections.

Solution:
It is recommended to build such process in database layer and then called from ADF model layer.
With this approach, we have some benefits:
1) Database operations will be running in database servers with one db call.
2) Decouple database and application codes which will make it easier for maintenance.
3) Cleaner ADF backend codes

Example:
We can create ADF ApplicationModule class which contains method to invoke our database stored procedure.

public class AppModuleImpl extends ApplicationModuleImpl implements AppModule {

    public void callDBProc(String param1) {
        try {
            getDBTransaction().executeCommand("begin callDbProc('" + param1 + "'); end;");
        } catch (Exception sqle) {
            sqle.printStackTrace();
            throw new JboException(sqle.getMessage());
        }
    }

}

Wednesday, July 4, 2012

Shorter URL parameters for ADF Application

Yes. It is shorter than before now with new ADF version 11.1.2.2.0.

Old ADF URL parameters:
https://host/myapp/app1?_afrLoop=54603428702000&Adf-Window-Id=w0&_afrWindowMode=0&_adf.ctrl-state=8y48oltmq_3&_afrRedirect=54603481521000

New ADF 11.1.2.2.0 removes all these URL parameters except the controller state, so it becomes

https://host/myapp/app1?_adf.ctrl-state=8y48oltmq_7

I think in future release, all these internal parameters will be removed from URL and makes ADF Application prettier :)

WebLogic 11g : How to setup SSL for my website?

Okay, development is done, application deployed, but wait i need to ensure data is encrypted between users browser and my weblogic server. So how to do that?

Step 1. Generate a private keystore and private key

Example ./keytool -genkey -alias myalias -keyalg RSA -keysize 2048 -keystore mykeystore.jks

Step 2. Generate a CSR which we'll send to Certificate Authority
Example ./keytool -certreq -alias myalias -file mycertrequest.csr -keystore mykeystore.jks
Note: When generating a CSR, enter the domain of your website (i.e. www.mysite.com) in the "first- and lastname" field.

Step 3. Most of the Certificate Authority today uses Intermediate Certificate, so we need to import it to our trusted keystore
Example ./keytool -import -alias rootca -keystore mytrustkeystore.jks -trustcacerts -file intermediateCA.cer

Step 4. After receiving the certificate from Certificate Authority, import it into private key store (the initial keystore used to send the CSR)
Example ./keytool -import -alias myalias -keystore mykeystore.jks -trustcacerts -file sslcertfromca.cer

You can view the contents of keystore using below command:
./keytool -list -v -keystore mykeystore.jks -storepass mypassword

Step 5. Configure weblogic server keystore and SSL
Your Server > Configuration > Keystores
Change the Keystores to Custom Identity and Custom Trust, and then put the Keystore details as you have created before. Keystore type is JKS.

Your Server > Configuration > SSL
Put the alias that you have created before and password.

Save.

After completing above steps, restart weblogic server and don't forget to enable SSL port. Now you should be able to access your application with https.

Saturday, June 25, 2011

Introduction to Oracle J2EE Application Development Framework: Oracle ADF

If you are Java Developer and looking for a great, future proof J2EE Framework, you are at right place.
Oracle J2EE Framework has been evolved for more than 10 years. It has been improving in every release and still intensively developed by Oracle. In fact, it is the core development framework for Oracle Fusion Applications (Oracle E-Business, SOA Suite, WebCenter etc).

It started using the name Java Business Object (JBO, that's how oracle.jbo package came from), then change into Business Component for Java (BC4J), then Oracle Application Development Framework (ADF). Despite of these different naming, basic design principal is still the same with enhancement, features, bug fixes, etc.

I learned this framework since version 9i and all the experiences I had since then are still valid and it's never been a wasted effort, and i am really glad about it.

There are three main components of Oracle ADF:
1. Model
2. View
3. Controller

Simple explanation for above components:
Model is where your business data is stored (Persist).
View is where users view the Business Information based on the Model.
Controller is the connectors or links for your Views.

OK, let's start with a very basic Oracle ADF sample project. Typically, ADF Application has two projects: Model and ViewController.


Model Project contains all your business data objects. You can use different technology for this. Currently it supports ADF Business Component (XML of your database tables), Plain XML, Toplink, Text File, etc.

ViewController Project contains all your Web Application pages and ADF Controller XML files.


In above screenshot, i'm using ADF BC (That's it AppModule, Emp, EmpView are my Business Components which are built using ADF BC) in Model Project and Facelets (Emp.jsf) with ADF Controller (adfc-config.xml) in ViewController project. I hope with this very brief explanation of Oracle ADF could help you to understand what is Oracle ADF and its components.

Want to see the demo? check out this link Oracle ADF demo

Cheers!

Wednesday, May 18, 2011

So when to use Active Data Guard or Golden Gate?

On my previous post, I posted some differences between Active Data Guard and Golden Gate. But some people may find it more confusing and ask when should I use Active Data Guard? or Golden Gate?

So let me try to summarize it here:

Use Active Data Guard for:
Disaster Recovery, Data Protection/HA (Oracle environment)

Use Golden Gate for:
Information Distribution, Data Integration, Cross-platform migrations (For ex. SQL Server to Oracle)


They can also complements each other.
ADG provides read-only replica for standby database, and GG capturing standby archive logs then replicating it to 'n' different target systems.

Saturday, May 14, 2011

What's the difference between Active Data Guard and GoldenGate?

Active Data Guard vs Golden Gate?

Active Data Guard (ADG) is a replication technology from Oracle to create exact mirror of one database.
GoldenGate (GG) is a heterogeneous database replication from different database vendors to one or more target repository (Database, File, JMS Queue, etc.).

Summary of the differences between ADG and GG:

Active Data Guard:
- Ship from memory
- Sync or Async
- Simple one way replication
- Standby open read-only
- Zero I/O overhead, near-zero primary performance impact
- Standby database is exact physical replica
- No data type or other restrictions
- Integrated with Oracle Kernel

GoldenGate:
- Read and ship from redo logs (configurable to read directly from table, if necessary)
- Async only
- Advanced, multi-master replication (if conflicts can be avoided or resolved)
- Target database open read-write
- I/O Overhead and capture processing on primary
- Replica is logical copy maintained using SQL
- Data type and other restrictions
- External to Oracle Database

From licensing perspective, GoldenGate bundles Active Data Guard together.

Tuesday, April 26, 2011

Out-of-the-box Result Caching with Oracle Service Bus

On my previous post (http://rickyhp.blogspot.com/2011/04/creating-robust-scale-out-data.html), i have shared about Data Abstraction and Cache with Oracle Coherence. Today let's see how Oracle Service Bus can provide out-of-the-box data cache solution for your existing web services without changing any of your application's code.

Oracle Service Bus provides out-of-box caching mechanism using Oracle Coherence. You can use it to cache result from any Business Services.
This can dramatically improve performance if the response from the business service is relatively static.
Oracle Service Bus uses a single cache for all business services. Only valid/correct results from business services are cached.

For cache expiration, cached results have a time-to-live (TTL) attribute.
You can configure cache expiration either with the Expiration Time property in the Result Caching configuration on the business service or the cache-ttl element in the $transportMetaData using the proxy service message flow.

If Oracle Coherence finds that the TTL has expired, it flushes the cache, and the business service invokes the external service for a result. That result is then stored in the cache (if there is no error in the result), and the result is available in the cache so that it can be returned to the next request.

The following events illustrate how Oracle Service Bus/Coherence flush cache:

•Cache TTL has expired – Each cached result has its own TTL. When a TTL is reached, Oracle Coherence flushes that individual cached result.

•Disable result caching on a single business service – When you disable result caching on a business service, Oracle Service Bus triggers flushing of all cached results for that business service in Oracle Coherence.

•Update, Rename, or Delete a business service – If you update, rename, or delete a business services, Oracle Service Bus triggers flushing of all cached results for that business service from Oracle Coherence.

•Update dependent resource – When you update a dependent resource, such as a WSDL, Oracle Service Bus triggers flushing all cached results for that business service from Oracle Coherence. However, changes to the following dependent resources do not cause cache flushing: Service Provider, UDDI Registry, Alert Destination.

•Globally disable result caching – When you globally disable result caching, Oracle Service Bus triggers flushing the entire result cache (all cached results for all business services) from Oracle Coherence.

For details, please refer to below link:
http://download.oracle.com/docs/cd/E14571_01/doc.1111/e15867/configuringandusingservices.htm#OSBAG170

Oracle Fusion Middleware and Java Support Policy

Many people confuse with Oracle Support Policy regarding Oracle Fusion Middleware and Java, especially after Oracle acquires Sun Microsystem.

Any Oracle Fusion Middleware products (including Oracle WebLogic Server and Oracle Application Server) are supported as a single unit. When Java SE is used to run an Oracle product, it is treated as an integrated component in the product and follows the End of Life of the middleware product.

Examples:
  • End of Life (EOL) was announced for J2SE 1.4.2 in June 2007 and for J2SE 5.0 in October 2009. Several versions of Fusion Middleware products run on these versions of J2SE. The J2SE End of Life only applies to J2SE when used standalone or with 3rd party applications. For Fusion Middleware, the Oracle Lifetime Support Policy Extended Support time lines take precedence.

  • When Oracle announces End of Life for Java SE 6 or a later version of Java SE, that announcement only applies for Java SE used standalone or with a 3rd party product. For Fusion Middleware, the Oracle Lifetime Support Policy Extended Support time lines take precedence.
Hope this helps people who has concerns on Oracle Product Support Policy

Cheers!

Sunday, April 24, 2011

Creating a robust, scale-out data abstraction layer with Oracle Coherence

Oracle Coherence is an in-memory data grid solution that enables organizations to predictably scale mission-critical applications by providing fast access to frequently used data. Data grid software is middleware that reliably manages data objects in memory across many servers. By automatically and dynamically partitioning data, Oracle Coherence enables continuous data availability and transactional integrity, even in the event of a server failure. Oracle Coherence provides organizations with a robust, scale-out data abstraction layer.

In today post, i will guide you through how to install, configure and run simple Java Coherence Application. Hopefully, it could help people understand the basic concept of Coherence and able to implement it in their real project. Good Luck!

1. Download the latest version of Oracle Coherence for Java here:
http://www.oracle.com/technetwork/middleware/coherence/downloads/coherence-101246.html

2. Download JDeveloper 11.1.1.3 here:
http://www.oracle.com/technetwork/developer-tools/jdev/downloads/soft11-098086.html

3. Unzip and Install Oracle Coherence and JDeveloper.
Ensure that the directory name you install into does not have any spaces.

4. Configure Java Home and Coherence
1. Setup JAVA_HOME for Oracle Coherence
• In the coherence.cmd and cache-server.cmd (located in [COHERENCE_HOME]\coherence\bin) set the JAVA_HOME variable to point to your JSDK 1.6 environment.

SET JAVA_HOME=[JDK PATH]

In Windows explorer change to the [COHERENCE_HOME]\coherence\bin directory.

• In the file coherence.cmd (or coherence.sh), find the line with set storage_enabled and
change the value false to true.

set storage_enabled=true

This option specifies if a process is a “Storage Enabled Member” when joining the cluster. Storage enabled members can store data as part of a Coherence cluster.

• Save the files and exit.

5. Run Coherence Cache Server
• From the [COHERENCE_HOME\coherence\bin directory run the following file: cache-server.cmd
• This will start up a storage enabled member in the cluster. When you start the first cache-server up you will notice a slight delay as the cache server looks for an existing cluster. Once it determines there are no clusters to join, it will start one.

Note: by default Coherence uses multicast to search for cluster members only. Multicast is not used for data transfer. If you cannot use or do not want to use multicast then this can be configured.

• You should see a number of messages displayed and at the bottom of your console, you should see below message:

Started DefaultCacheServer...

6. Run coherence console and test the Cache Server
  • Run coherence.cmd (windows) or coherence.sh (unix/linux)
  • You should now see the following prompt:
    Map (?):
  • This application shows you the basic distributed cache functionality build within
    Coherence
  • Type in the following to create a new named cache called test.
    cache test
  • Each named cache can be thought of as a table. A cluster can have many named caches. Each named cache holds one type of object. It can be a simple object such as a String, or a complex object that you define
  • Type in the command help to see the list of commands available. The following
    commands are the ones you will use most:
    • put – puts a name value pair (key and value) into the cache. Always returns the last
    value that the key had; get – retrieves the value for the given key from the named cache;
    • list – shows the contents of the named cache;
    • remove – removes a key value from the cache
  • Use the commands above and put and get some values. For ex. put name John [enter], get name [enter]
7. Create Java Application and connect to Cache Server
Since you're going to use Coherence API. You must configure coherence java libraries (under your [COHERENCE_HOME]/coherence/lib) before writing and compiling the applications.


Below is the code that you can use to put and get some value from Cache Server:

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class MyFirstSample {
public MyFirstSample() {
}

public static void main(String[] args) {

// ensure we are in a cluser
CacheFactory.ensureCluster();

// create or get a named cache called mycache
NamedCache myCache = CacheFactory.getCache("mycache");

// put key, value pair into the cache.
myCache.put("Name","John");

System.out.println("Value in cache is " + myCache.get("Name"));

}
}

That's it. Congratulations! you have successfully created your first robust, scale-out java application using Oracle Coherence Data Cache Solution. With this simple example, you could have different data sources i.e. Oracle Database, SAP, Siebel, etc. and put them onto the Cache Server that a variety of clients can connect, get some valuable information from it.


Tuesday, April 19, 2011

Oracle has two approaches for BPM:
1. Using BPMN and BPEL along side by side, and run them with single runtime engine (BPM Suite + SOA Suite)
2. Using BPMN and generate or merge it into BPEL, and run them with BPEL engine (BPA Suite + BPM Suite + SOA Suite)

How does it transform business process into a BPEL process?

The business process models are abstract and have to be implemented before they can be realized. Once business decides that a specific version of the process model is ready for implementation, the model is marked for IT implementation and saved in the Business Process Repository. The blueprint can now be used to create a BPEL process in Oracle JDeveloper.
BPEL transformation generates Process Blueprint and associated skeletal BPEL code. The IT developer needs to add implementation details to the BPEL code to convert it into an executable process that can be deployed on the run-time engine (BPEL Process Manager).

The transformation a business process into a BPEL process comprises the following:
■ Notification Services are transformed into a Business Scope upon BPEL transformation. The corresponding Notification service as well as the BPEL artifacts for invoking the Notification service are created within the business scope.
■ Human tasks are converted to a human workflow business scope upon BPEL transformation. The Task Service gets automatically generated as well as the BPELartifacts for invoking the Task service also gets generated. The Notification/Reminder notes get translated to business annotations.
■ Automated activities are converted to a business scope upon BPEL transformation.
■ Business Service is converted to a Partner Link upon BPEL transformation. If the Business Service is associated with a concrete WSDL, it is converted to a concrete Partner Link. Otherwise, it is converted into an abstract Partner Link. If Represented by is set to "invoke", an invoke activity is created inside the business scope and is linked to the Partner Link. If Represented by is set to "receive", a receive activity is created inside the business scope and is linked to the Partner Link. The Sensor definition is converted in to a business annotation.
■ XOR, AND and OR gateways are converted to switch and case statements upon BPEL transformation.
■ All Business Data in the Business Process Diagram are converted to Variables upon BPEL transformation. If the Business Data is associated with an XSD, the XSD is exported and the Variable in the BPEL skeletal process generated is then set to the XSD type. Otherwise, the Variables are set to String type.
■ Business Rules are converted into a Decision Service. The free text in the Rules field is converted into business annotation.

BPA View




BPEL View in JDeveloper



Cool..you can switch BPEL view and BPA view.

BPM Studio documentation stated somewhere that we can convert bpmn process to bpel which i can't find it. Because when you create SOA project from JDeveloper and connect it to BPA Repository, it will only convert it.

Sunday, April 17, 2011

Securing your Enterprise Web Services using Oracle Enterprise Gateway 11g


Oracle Enterprise Gateway is positioned for First Line of Defense in your company's DMZ.


Here are the list of some features you could get from Oracle Enterprise Gateway:


1. XML Firewall



  • Checking for XML well-formedness

  • XML document size

  • XPath and XQuery injection

  • SQL injection

  • XML encapsulation

  • XML viruses

  • Scanning outgoing messages for sensitive content based on metadata or regular expression patterns

  • Detecting XML bombs and XML clogging

  • Scanning WSDL files

2. Accelerated XML Processing



  • Frees up resources on application servers

  • Enables applications to run faster

  • Patented acceleration engine

  • Faster XML validation

  • Faster processing of XML queries and transformations

Oracle Enterprise Gateway could be used together with Oracle Service Bus for Web Services Virtualization and Last-Mile Security (as shown in above picture).

Monday, September 20, 2010

Oracle Enterprise Manager 10g Application Diagnostics for Java

Oracle AD4J is a lightweight Java application monitoring and diagnostics tool that enables administrators to diagnose performance problems in production.

There are two installations, one is AD4J Agent and the other is AD4J Console.
AD4J Agent is a j2ee application need to be deployed in target OC4J (which you need to diagnose).
AD4J Console is a web based application which you can use to monitor the application in target OC4J (which you have installed AD4J Agent).

Installation steps:
1. Download and install AD4J Console on any server
2. Login to AD4J Console, and download AD4J Agent
3. Deploy AD4J Agent to target J2EE Server
4. You can check in target J2EE Server log to verify AD4J is running (For OC4J it will be in OC4J OPMN log)

For more information on how to install AD4J Agent and Console, please follow below link:

Thursday, August 19, 2010

Install Oracle JDeveloper 11g on Mac

To install Oracle JDeveloper 11g (11.1.1.3) on Mac Snow Leopard is pretty straightforward.
Make sure you have updated Java to version 1.6 and set it as default in Java Preferences.

After that, execute below commands in terminal:

$ cd /System/Library/Frameworks/JavaVM.framework/Versions/
$ sudo rm CurrentJDK
$ sudo ln -s 1.6.0 CurrentJDK

Tuesday, April 29, 2008

Like '%' and ROWNUM

I've found many of developers using like with '%' and allowing application user to fetch all rows in table. For example consider query like this:

select * from ms_account where customer_name like '%'||:p_1||'%'

When the users submit the query using a,b or % only, the database will query all the records and could cause very high consumption server resources (Memory, I/O, CPU)

Using rownum could help.

select * from ms_account where customer_name like '%'||:P_1||'%' and rownum <= 10. This will fetch the query with maximum 10 records.

Learn more about rownum : http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

You should limit your query (espesially the one with LIKE)

Thursday, January 3, 2008

Oracle Forms vs Oracle ADF

I've been using Oracle Forms/Reports for about 5 years,with all of its pros and cons. About 2 years ago, i have opportunity to implement my j2ee skill using Oracle ADF Swing,JSP and ADF Business components. It was a great learning experience. Right now, with EJB 3.0 released, i research more into ADF Toplink and ADF Faces to accelerate my skill set.

My opinion is:
1.Use Oracle Forms wisely. You have to understand the network requirement that could impact your application performance and the architecture flexibility. We can not configure cluster for Oracle Forms. You have to buy Load Balancer, either hardware or software to achieve high availability.

2.Use Oracle ADF to gain more flexibility in designing your application. With this framework, you have a lot of flexibility from choosing persistence technology to the client type. Oracle ADF has excellent data binding features. You can use different persistence technology ie. Toplink,ADF BC, Flat files, XML, etc. and display it using the same client code or reversely you can used your persistence component to different client type ie. web apps, swing, mobile.

Use the tools wisely and carefully...... "flexibility comes with complexity" :)

Saturday, March 10, 2007

How to enable load balance stateful session bean ?

Hi..recently one of my customer need to setup load balance for their ejb java applicationbuilt using JDeveloper,ADF technology ( ADF JClient ).They're looking for how to setup load balance between 2 ejb containers.

Finally i've found out that you have to set

'LoadBalanceOnLookup=true' property.

and to really load balance the method call, you have to re-create the InitialContexteach time when calling the ejb method.I know it may quite impact on performance,hopefully OC4J team in next release can enhance this.
This is the implementation with ADF Business Component.You can create your customize strategy class like this :

public class Test {
private static final String EJB_BEAN_NAME = "AppModule2Bean";
public static ApplicationModule getAppModule()
{
try
{
Context ctx = getContext();
AppModule2Home home = (AppModule2Home) ctx.lookup(EJB_BEAN_NAME);
ApplicationModule am = ApplicationModuleProxy.create(home,null /* or some client props */);
am.getTransaction().connectToDataSource(null, "jdbc/Scott1DS", false); return am; }
catch (NamingException nex) { return null; } }

private static InitialContext getContext() {
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.evermind.server.rmi.RMIInitialContextFactory"); env.put(Context.SECURITY_PRINCIPAL, "admin");
env.put(Context.SECURITY_CREDENTIALS, "welcome");
env.put("LoadBalanceOnLookup","true");
env.put("dedicated.rmicontext","true");
/* * PUT YOUR CUSTOM lookup: URL HERE */
env.put(Context.PROVIDER_URL, "ormi://rputra-id:23791/ProjectEJB1,ormi://rputra-id:23792/ProjectEJB1");
return new InitialContext(env); }
catch (NamingException e) { e.printStackTrace(); return null; } }}

public class CustomConnectionStrategy extends DefaultConnectionStrategy{
public CustomConnectionStrategy(){ }
public ApplicationModule createApplicationModule(Hashtable p0) {
JUApplication app = new JUApplication(Test.getAppModule());
AppModule2 appMod = (AppModule2)app.getApplicationModule();
return appMod;
}
}

and then in your ADF Application Module Configuration Manager (right click Application Module, choose Configuration),pick one of your configuration name and set this

jbo.ampool.connectionstrategyclass = 'your CustomConnectionStrategy class name'

that's it your j2ee application now is load balance enabled.