Showing posts with label JBOSS. Show all posts
Showing posts with label JBOSS. Show all posts

Friday, March 21, 2014

How to develop EJB client applications for EJB deployed in different ejb containers?

i am going to develop a standalone java application to access the EJB has been deployed. first of all forget about the underlying EJB container impletation and focus only on developing the client.

we are going to develop a EJB client for the EJB deployed with http://chathurangat.blogspot.com/2014/03/create-simple-stateless-session-bean.html post.


1. Add the deployed EJB jar file to the classpath of the client being developed. this is because, the client program needs the access for the EJB business interface and methods.  i have added it as a maven dependency and it will be downloaded with my local maven repo.
   
       

            com.chathurangaonline.ejb.samples

            ejb-business-interface

            1.0

        

The JNDI and other configuration properties will differ between EJB containers. therefore we need to change those properties based on the EJB container that is we are going to access.

pom.xml

 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.chathurangaonline.samples</groupId>
    <artifactId>ejb-client-example</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>ejb-client-example</name>
    <url>http://maven.apache.org</url>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.chathurangaonline.ejb.samples</groupId>
            <artifactId>ejb-business-interface</artifactId>
            <version>1.0</version>
        </dependency>

         <!--this dependency is required if the client is going to access the EJB deployed in the glassfish server-->
        <dependency>
            <groupId>org.glassfish.main.appclient.client</groupId>
            <artifactId>gf-client</artifactId>
            <version>3.1.2</version>
            <scope>system</scope>
            <systemPath>/home/chathuranga/Softwares/glassfish3/glassfish/lib/gf-client.jar</systemPath>
        </dependency>

    </dependencies>
</project>



EJB client for Jboss server

 
package com.chathurangaonline.ejb.samples;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;

public class EJBClientJboss {

    public static void main(String[] args) {

        final String jndiName = "ejb-business-interface-1.0/SalaryCalculatorImpl!com.chathurangaonline.ejb.samples.SalaryCalculator";

        //configurations for accessing the EJB deployed in the glassfish server
        Properties jndiProps = new Properties();
        jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory");
        jndiProps.put(Context.PROVIDER_URL,"remote://localhost:4447");
        jndiProps.put(Context.SECURITY_PRINCIPAL, "appuser");
        jndiProps.put(Context.SECURITY_CREDENTIALS, "appuser123");
        jndiProps.put("jboss.naming.client.ejb.context", true);

        try{
            Context ctx = new InitialContext(jndiProps);

            Object obj = ctx.lookup(jndiName);
            System.out.println("lookup returned " + obj);

            SalaryCalculator salaryCalculator = (SalaryCalculator) obj;
            Double salaryIncrement =  salaryCalculator.getAnnualIncrementOnBasicSalary(55000.00);
            System.out.println(" salary increment is ["+salaryIncrement+"]");

        }
        catch (NamingException ex){
            System.out.println(" message ["+ex.getMessage()+"]");
            System.out.println(" ex ["+ex+"]");
        }
    }
}




EJB Client for glassfish server 

 
package com.chathurangaonline.ejb.samples;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;

public class EJBClientGlassfish {

    public static void main(String[] args) {

        final String jndiName = "java:global/ejb-business-interface-1.0/SalaryCalculatorImpl!com.chathurangaonline.ejb.samples.SalaryCalculator";

        //configurations for accessing the EJB deployed in the glassfish server
        Properties jndiProps = new Properties();
        jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
        jndiProps.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
        // glassfish default port value will be 3700
        jndiProps.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

        try{
            Context ctx = new InitialContext(jndiProps);

            Object obj = ctx.lookup(jndiName);
            System.out.println("lookup returned " + obj);

            SalaryCalculator salaryCalculator = (SalaryCalculator) obj;
            Double salaryIncrement =  salaryCalculator.getAnnualIncrementOnBasicSalary(55000.00);
            System.out.println(" salary increment is ["+salaryIncrement+"]");

        }
        catch (NamingException ex){
            System.out.println(" message ["+ex.getMessage()+"]");
            System.out.println(" ex ["+ex+"]");
        }
    }
}



You will notice that we have change only the properties based on the EJB container/server.


Thanks
Chathuranga Tennakoon


Thursday, March 20, 2014

Create Simple Stateless session bean with EJB 3.x


You can create a simple java application project with maven. then you need to create the business interface and implementation beans for the EJB.

 Then the application will looks like as below.


 pom.xml

    4.0.0
    com.chathurangaonline.ejb.samples
    ejb-business-interface
    jar
    1.0
    ejb-business-interface
    http://maven.apache.org
    

        
            junit
            junit
            3.8.1
            test
        

        
            org.testng
            testng
            6.8.8
        

        
            javax
            javaee-api
            7.0
        

        
            org.jboss
            jboss-remote-naming
            1.0.7.Final
        

        
            org.jboss.xnio
            xnio-nio
            3.0.3.GA
        

    

    
        
            
                maven-compiler-plugin
                
                    1.7
                    1.7
                
            
        
    




SalaryCalculator.java (Business Interface)


package com.chathurangaonline.ejb.samples;

import javax.ejb.Remote;

@Remote
public interface SalaryCalculator {

    Double getAnnualIncrementOnBasicSalary(Double basicSalary);
}




@Remote annotation will be used because, i am planing to run the client in a separate JVM from the JVM where the EJB deployed and runs.




SalaryCalculatorImpl.java (Implementation Bean)


package com.chathurangaonline.ejb.samples;

import javax.ejb.Stateless;

@Stateless
public class SalaryCalculatorImpl implements SalaryCalculator{

    @Override
    public Double getAnnualIncrementOnBasicSalary(Double basicSalary) {
        if(basicSalary > 0 && basicSalary <= 35000){
            return basicSalary*0.2;
        }
        else if(basicSalary >35000){
            return  basicSalary*0.1;
        }
        else{
            throw new IllegalArgumentException();
        }
    }
}

this will be a stateless session bean.



SalaryCalculatorImplTest.java (TestNg Unit tests)


package com.chathurangaonline.ejb.samples;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SalaryCalculatorImplTest {

    private static SalaryCalculator salaryCalculator;

    @Test(expectedExceptions = IllegalArgumentException.class)
    public void testGetAnnualIncrementOnBasicSalaryWithNull() throws Exception {

       salaryCalculator.getAnnualIncrementOnBasicSalary(null);
    }

    @Test(expectedExceptions = IllegalArgumentException.class)
    public void testGetAnnualIncrementOnBasicSalaryWithNegativeValue() throws Exception{

     salaryCalculator.getAnnualIncrementOnBasicSalary(-90000D);
    }

    @Test(expectedExceptions = IllegalArgumentException.class)
    public void testGetAnnualIncrementOnBasicSalaryWithZero() throws Exception{

        salaryCalculator.getAnnualIncrementOnBasicSalary(0d);
    }

    @Test
    public void testGetAnnualIncrementOnBasicSalary(){

       double increment = salaryCalculator.getAnnualIncrementOnBasicSalary(50000d);
        System.out.println(" increment ["+increment+"]");
        Assert.assertTrue(increment>0);
    }

    @BeforeClass
    private void setUp(){
        if(salaryCalculator == null){
             salaryCalculator = new SalaryCalculatorImpl();
        }
    }
} 
 




Once this is developed, this can be compiled and packaged as a jar file.
then it can be deployed in any  EJB container (like Glassfish, Jboss etc...).
once it is deployed, check the log in the EJB continer to get the required JNDI
configurations for the EJB being deployed. those will be required when the
client is developed.

 we will look at in the next post, how to develop EJB cline tapplication for the EJB deployed in different EJB containers.


Thanks
Chathuranga Tennakoon
http://www.chathurangaonline.com/