EJB: the details
description
Transcript of EJB: the details
J01
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
EJB: the details
J02
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Actors:
Component Interface:Same role as in RMI
Component Implementation:Same role as in RMI
Home Interface:Implemented by the server, plays the role of a factory class for the component
JNDI service:Plays the same role as the register in RMI
J03
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
NamingService
DirectoryMachine
Client
ClientMachine
The logical architecture
Pool
App server (container)Machine
HomeInterface
Trovami la Home interface
Dammi unaistanza
Istanza
Crea o recupera una istanza
Trova
Metodo()
J04
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Session Beans -) stateless -) stateful
J05
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful Example
Stateless Example: Euro Converter
J06
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful Example – suggested hierarchy
App
server client
srcsrc
META-INF
ejb-jar.xml
deploy
xHome.javaxHome.class
client.javax.java
xBean.java
x.class
xBean.class xHome.classx.class
J07
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The Component (Remote) Interface
package statelessDemo;
import java.rmi.*;import javax.ejb.*;
public interface Converter extends EJBObject { public double convert(int lire);}
J08
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The Home Interface
package statelessDemo;import java.rmi.*;import javax.ejb.*;
public interface ConverterHome extends EJBHome { public Converter create() throws RemoteException, CreateException;}
J09
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The bean
package statelessDemo;import java.rmi.*;import javax.ejb.*;
public class ConverterBean implements SessionBean { private SessionContext sessionContext; public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; } private static double ratio=1936.27; public double convert(int lire) { return lire/ratio; }}
J010
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The descriptor
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd"><ejb-jar> <description>A simple demo of a stateless Bean</description> <display-name>An Euro Converter Bean</display-name> <enterprise-beans> <session> <description>A converter from Lire to Euro</description> <ejb-name>EuroConverter</ejb-name> <home>statelessDemo.ConverterHome</home> <remote>statelessDemo.Converter</remote> <ejb-class>statelessDemo.ConverterBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans>
J011
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The descriptor
<assembly-descriptor> <container-transaction> <method> <ejb-name>EuroConverter</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> <ejb-client-jar /></ejb-jar>
J012
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
structure of the jar file
META-INF
ejb-jar.xml
statelessDemo
Converter.class
In this directory, run jar cvf converter.jar *
ConverterBean.class ConverterHome.class
this directory(ies) reflect the package hierarchy
Watch out! Packages often make life complex.(it’s easy to make mistakes) Try first without packages.
J013
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Compile the sources, generate jar file
clsjavac Converter.javamove Converter.class statelessDemo\javac ConverterHome.javamove ConverterHome.class statelessDemo\javac ConverterBean.javamove ConverterBean.class statelessDemo\
cd ..\deploymentdel *.jardel statelessDemo\*.class
move ..\src\statelessDemo\* statelessDemo\jar cvf Converter.jar *cd ..\src
J014
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Start the container
We assume you installed the j2ee sdk distribution provided by
Sun in some %J2EE_HOME% directory.
1) Run %J2EE_HOME%/bin/j2ee.bat2) Run %J2EE_HOME%/bin/deploytool.bat
J015
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Start the container
FileNew Application…
FileAdd to Application… EJB-JAR(scegliere converter.jar)
J016
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
View the properties
J017
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Start deployment
ToolsDeploy
Check this box
Crea ConverterApp.ear
J018
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Start deployment
Choose a JNDI name
J019
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Start deployment
Crea ConverterAppClient.jar
J020
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The client
import javax.ejb.*;import javax.naming.InitialContext;
public class ConverterClient { public ConverterClient() { } public static void main(String[] args) { try { InitialContext ctx=new InitialContext(); Object objref=ctx.lookup("L2EConverter");
statelessDemo.ConverterHome home = (statelessDemo.ConverterHome) javax.rmi.PortableRemoteObject.narrow( objref,statelessDemo.ConverterHome.class);
statelessDemo.Converter bean=home.create();
Get naming context and object reference
Cast to correct type
Get a bean instance from container
JNDI name
J021
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – The client
int lire=100000; System.out.println(lire+" Lire = "+
bean.convert(lire)+" Euro"); } catch (javax.naming.NamingException ex) { System.out.println("NamingException: "+ex); } catch (ClassCastException cc) { System.out.println(" ClassCastException : "+cc);} catch (javax.ejb.CreateException ce) { System.out.println("CreateException: "+ce); } catch (java.rmi.RemoteException re) { System.out.println("RemoteException: "+re); } }}
Do your business
J022
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Compile the client
clscd client\statelessDemo\copy ..\server\deployment\statelessDemo\Converter.class .copy ..\server\deployment\statelessDemo\ConverterHome.class .cd ..javac ConverterClient.java
Questa è la directory che contiene i sorgenti del client
J023
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless example – execution
java -classpath .;%J2EEHOME%\lib\j2ee.jar;…\ConverterAppClient.jar -Dorg.omg.CORBA.ORBInitialHost=localhost ConverterClient
100000 Lire = 51.64568990894865 Euro
J024
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful Example
Stateful Example: Dollar Converter
J025
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The Component (Remote) Interface
import java.rmi.*;import javax.ejb.*;
public interface DollarConverter extends EJBObject {
public double convertInEuro(double dollar) throws java.rmi.RemoteException;
public double convertInDollar(double euro) throws java.rmi.RemoteException;
public void setRate(double euro_dollar_ratio) throws java.rmi.RemoteException;
}
J026
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The Home Interface
import java.rmi.*;import javax.ejb.*;
public interface DollarConverterHome extends EJBHome { public DollarConverter create() throws RemoteException,
CreateException;}
J027
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The bean
import java.rmi.*;import javax.ejb.*;
public class DollarConverterBean implements SessionBean { private SessionContext sessionContext; public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; }
J028
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The bean
private double euro_dollar_ratio=1;
public double convertInEuro(double dollar) throws java.rmi.RemoteException{
return dollar/euro_dollar_ratio; }
public double convertInDollar(double euro) throws java.rmi.RemoteException{
return euro*euro_dollar_ratio; }
public void setRate(double euro_dollar_ratio) throws java.rmi.RemoteException{
this.euro_dollar_ratio=euro_dollar_ratio; }}
J029
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The descriptor
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd"><ejb-jar> <description>A simple demo of a stateful Bean</description> <display-name>An Euro to Dollar Converter Bean</display-name> <enterprise-beans> <session> <description>A converter from Euro to Dollar</description> <ejb-name>DollarConverter</ejb-name> <home>DollarConverterHome</home> <remote>DollarConverter</remote> <ejb-class>DollarConverterBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans>
J030
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The descriptor
<assembly-descriptor> <container-transaction> <method> <ejb-name>DollarConverter</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> <ejb-client-jar /></ejb-jar>
J031
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The client
import javax.ejb.*;import javax.naming.InitialContext;import javax.rmi.PortableRemoteObject;
public class ConverterClient { public ConverterClient() {} public static void main(String[] args) { Object objref=null; DollarConverterHome home=null; DollarConverter bean=null; try { InitialContext ctx=new InitialContext(); objref=ctx.lookup("EDC"); home =(DollarConverterHome)PortableRemoteObject.narrow(
objref,DollarConverterHome.class);
bean=home.create();
Get naming context and object reference
Cast to correct type
Get a bean instance from container
JNDI name
J032
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – The client
bean.setRate(0.978);
double euro=1000; System.out.println(euro+" Euro = "
+bean.convertInDollar(euro)+" Dollar");
double dollar=1000; System.out.println(dollar+" Dollar = "
+bean.convertInEuro(dollar)+" Euro");
} catch (Exception e) { e.printStackTrace(); } }}
Do your business
J033
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful example – execution
java -classpath .;%J2EEHOME%\lib\j2ee.jar;…\DollarConverterAppClient.jar -Dorg.omg.CORBA.ORBInitialHost=localhost ConverterClient
1000.0 Euro = 978.0 Dollar1000.0 Dollar = 1022.4948875255624 Euro
J034
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Session Beans Lifecycle: client’s view
Does not existIs not referenced
ExistsIs not referenced
ExistsIs referenced
Does not existIs referenced
Start
home.create()
Clientreleasesreference
Crash,Timeout
Clientreleasesreference
Clientobtainshandle
object.remove(),home.remove(),Crash, timeout
Clientinvokesmethod
Client invokes method (NoSuchObject Exception)
J035
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateless session Beans Lifecycle
ExistsIn the pool
Does not exist
ejbRemoved()
Client invokes method
Client invokes method (NoSuchObject Exception)
1) newInstance()2) setSessionContext(sc)3) ejbCreate()
Client invokes create()Container executes: Client invokes remove()
Container executes:
J036
Marc
o R
onch
ett
i
-
ronch
et@
dit
.unit
n.it
“Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento
Stateful session Beans Lifecycle
Passive
ejbPassivate()
ejbActivate()
Exists, method ready
in the pool
Does not existClient invokes remove(), or timeout is reachedContainer executes:ejbRemoved()
Client invokes create()Container executes:1) newInstance()2) setSessionContext(sc)3) ejbCreate()
Client invokes non TX method
Exists, method ready
in TX
Client invokes TX method
Client invokes TX methodAfterBegin()
Client invokes commitbeforeCompletion()afterCompletion(true)
Client invokes rollbackafterCompletion(false)