EJB: the details

Post on 21-Jan-2016

50 views 0 download

description

EJB: the details. 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. Directory Machine. - PowerPoint PPT Presentation

transcript

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)