ejb - laboratorium

32
EJB - laboratorium

Upload: alan-sampson

Post on 02-Jan-2016

39 views

Category:

Documents


2 download

DESCRIPTION

EJB - laboratorium. Agenda. tworzenie i instalacja session oraz entity EJB dostęp do zdalnego obiektu Konfiguracja serwera aplikacji JBoss. Proces tworzenia aplikacji. interfejsy Beana (local, remote, home) implementacja Beana deskryptory (application, ejb-jar, serwera aplikacji) - PowerPoint PPT Presentation

TRANSCRIPT

EJB - laboratorium

Agenda

tworzenie i instalacja session oraz

entity EJB dostęp do zdalnego obiektu Konfiguracja serwera aplikacji JBoss

Proces tworzenia aplikacji

-interfejsy Beana (local, remote, home)-implementacja Beana-deskryptory (application, ejb-jar, serwera aplikacji)-kod klienta (jsp, servlet, pure Java)-złożenie (assemblacja – jar, war, ear)

Nazewnictwo – dobre praktyki

<nazwaBeana> np. Fortune

- implementacja bean sesyjnego- FortuneEJB- implementacja bean encji CMP- FortuneCMP- implementacja bean encji BMP- FortuneBMP- Interfejs zdalny beana sesyjnego- FortuneSB- Interfejs lokalny beana sesyjnego - FortuneSBLocal- Interfejs zdalny beana encji- FortuneEB- Interfejs lokalny beana encji - FortuneEBLocal- Interfejs domowy zdalny beana sesyjnego- FortuneSBHome- Interfejs domowy lokalny beana sesyjnego - FortuneSBLocalHome- Interfejs domowy zdalny beana encji- FortuneEBHome- Interfejs domowy lokalny beana encji - FortuneEBLocalHome

Serwer Aplikacji

Fortune Teller

klient

FortuneTellerSB

getFortune()

Fortune Teller

FortuneEBLocal

Baza Danych

SQL/JDBC

Jeśli istnieje wiele rekordów tylko jeden pobierany losowo!

addFortune(String)

FortuneTeller – kod bean-a sesyjnego

public class FortuneTellerEJB implements SessionBean, FortuneTellerSB {

public void ejbCreate() throws CreateException {}

public String getFortune() { .... }public String addFortune(String fortune) { .... }

public void setSessionContext(SessionContext arg0) throws .... {}

public void ejbRemove() throws .... {}public void ejbActivate() throws .... {}public void ejbPassivate() throws .... {}}

Fortune Teller – interfejsy

zdalny (remote)public interface FortuneTellerSB

extends javax.ejb.EJBObject {public String getFortune() throws

RemoteException; public String addFortune(String fortune)

throws RemoteException;}

domowy (home)public interface FortuneTellerSBHome

extends javax.ejb.EJBHome {FortuneTellerSB create() throws CreateException,

RemoteException;}

FortuneCMP – interfejs lokalny

public interface FortuneEBLocal extends javax.ejb.EJBLocalObject{

public String getText();

public void setText(String text);

public Integer getId();

}

FortuneCMP – lokalny interfejs domowy

public interface FortuneEBLocalHome extends javax.ejb.EJBLocalHome {

public FortuneEBLocal create(String text) throws CreateException;public java.util.Collection findAll() throws javax.ejb.FinderException;public FortuneEBLocal findByPrimaryKey(Integer id) throws javax.ejb.FinderException;

}

- tworzenie- wyszukiwanie

FortuneCMP 1/2public abstract class FortuneCMP implements EntityBean{public abstract Integer getId();public abstract void setId(Integer id);public abstract String getText();public abstract void setText(String text);

public Integer ejbCreate(String text) throws CreateException {

//enumerator bean albo sekwencje z bazy danych ...setId(id);setText(text);return null;

}public void ejbPostCreate(String text) throws

CreateException {}

FortuneCMP 2/2

/***** Entity bean specific methods ********/

public void setEntityContext(EntityContext arg0)

throws (...){}

public void unsetEntityContext() throws (...){}

public void ejbLoad() throws (...){}

public void ejbStore() throws (...){}

public void ejbRemove() throws (...) {}

public void ejbActivate() throws (...){}

public void ejbPassivate() throws (...) {}

}

FortuneCMP – deskryptor ejb-jar.xml

(...)<enterprise-beans>

<entity> <ejb-name>FortuneCMP</ejb-name><local-home>edu.(...).FortuneEBLocalHome</local-home> <local>edu.(...).FortuneEBLocal</local><ejb-class>edu.(...).FortuneCMP</ejb-class>

<persistence-type>Container</persistence-type> <prim-key-class>java.lang.Integer</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>FortuneCMP</abstract-schema-name>

<cmp-field><field-name>id </field-name></cmp-field>

<cmp-field><field-name>text </field-name></cmp-field> <primkey-field>id</primkey-field>

</entity> (...)

FortuneCMP – deskryptorjbosscmp-jdbc.xml 1/2

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC

3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">

<jbosscmp-jdbc> <defaults> <datasource>java:/DefaultDS</datasource> <datasource-mapping>Hypersonic SQL</datasource-mapping> </defaults> <enterprise-beans> -------- opisy wszystkich CMP bean ------- na następnym slajdzie </enterprise-beans></jbosscmp-jdbc>

FortuneCMP – deskryptorjbosscmp-jdbc.xml 2/2

<enterprise-beans> <entity> <ejb-name>FortuneCMP</ejb-name> <create-table>true</create-table> <remove-table>false</remove-table> <table-name>t_fortune</table-name> <cmp-field> <field-name>id</field-name> <column-name>id</column-name> </cmp-field> <cmp-field> <field-name>text</field-name> <column-name>text</column-name> </cmp-field> </entity> </enterprise-beans>

FortuneCMP – jboss.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "//JBoss//DTD JBOSS 3.0//EN http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">

<jboss> <enterprise-beans> <entity> <ejb-name>FortuneCMP</ejb-name> <local-jndi-name>ejb/FortuneCMP</local-jndi-name> </entity> <session> <ejb-name>MyFortuneSB</ejb-name> <jndi-name>ejb/FortuneSB</jndi-name> </session> </enterprise-beans></jboss>

FortuneTeller – dostęp do EB 1/2

public void ejbCreate() throws CreateException {try { InitialContext ic = new InitialContext();

String fortuneEBHomeJNDI =(String)

ic.lookup("java:/comp/env/fortuneCMPRef");java.lang.Object objref = ic.lookup(fortuneEBHomeJNDI);fortuneEBLocalHome = (FortuneEBLocalHome) objref;

} catch (NamingException e) { throw new CreateException( "could not get reference to entity bean" + e); }}

FortuneTeller – dostęp do EB 2/2public String getFortune() { try { Collection fortunes = fortuneEBLocalHome.findAll(); //w EJBQL można zrobić count()... if (fortunes.size() > 0) { int which= (int)(Math.random()* fortunes.size()); FortuneEBLocal fortune = (FortuneEBLocal) fortunes.toArray( new FortuneEBLocal[0])[which]; return fortune.getText(); } else logger.info("no fortunes in db - dummyFortune"); } catch (FinderException e) { logger.error("could not find fortune", e); } return "dummyFortune";}

Fortune Teller – ejb-jar.xml 1/2

<?xml version="1.0"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans

2.0//EN„ "http://java.sun.com/dtd/ejb-jar_2_0.dtd"><ejb-jar> <display-name>FortuneBeans</display-name> <enterprise-beans> <.......................... Na następnej stronie..........> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>MyFortuneSB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor></ejb-jar>

Fortune Teller – ejb-jar.xml 2/2

<enterprise-beans> <session> <ejb-name>MyFortuneSB</ejb-name> <home>edu.agh.dsrg.sius.fortune.FortuneTellerSBHome</home> <remote>edu.agh.dsrg.sius.fortune.FortuneTellerSB</remote> <ejb-class>edu.agh.dsrg.sius.fortune.FortuneTellerEJB</ejb-

class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <env-entry> <env-entry-name>fortuneCMPRef</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>ejb/FortuneCMP</env-entry-value> </env-entry> </session> </enterprise-beans>

FortuneTeller – jboss.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN"

"http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd"><jboss> <enterprise-beans> <session> <ejb-name>MyFortuneSB</ejb-name> <jndi-name>ejb/FortuneSB</jndi-name> </session> </enterprise-beans> <resource-managers> </resource-managers></jboss>

FortuneTeller – plik jar

Struktura pliku jar: /META-INF/jboss.xml /META-INF/ejb-jar.xml /edu/agh..../*.class

(pliki klas zgodnie z nazwami pakietów)

Uwaga na wielkość liter....

FortuneTeller – desktyptor aplikacji

Deskryptor aplikacji – application.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD

J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>

<application> <display-name>Fortune</display-name> <module> <ejb>FortuneEJB.jar</ejb> </module></application>

Pominięto plik war dla aplikacji webowych

FortuneTeller – plik ear

Struktura pliku ear: /META-INF/application.xml /FortuneEJB.jar

nazwa zgodna z tą w deskryptorze!! /FortuneWEB.war

(opcjonalnie plik war – tu pomijamy)

JBoss - uruchomienie aplikacji

Serwer aplikacji (JBoss) www.jboss.org - rozpakować i ustawić

JAVA_HOME u nas JBHome = np. /tmp/${id}/jboss-3.2.7 uruchomienie {JBHome}/bin/run.sh

Plik aplikacji (ear lub jar) do {JBHome}/server/default/deploy

Logi w {JBHome}/server/default/log

Konsola admina – localhost:8080/jmx-console

JBoss - pokaz

- kompletny kod *.java- zawartość plików jar, ear- uruchomienie JBoss’a- instalowanie aplikacji (deploying)

- Analiza logów

Dostęp do Bean – aplikacja klienta, podstawowe kroki

Uzyskanie kontekstu JNDIPobranie referencji do obiektu Home Bean poprzez JNDIUzyskanie referencji do interfejsu Beana metodą create() wywołaną na interfejsie homeWywołanie metody biznesowej beana

Kontekst JNDI

InitialContext (jndi.properties) INITIAL_CONTEXT_FACTORY

java.naming.factory.initial=

org.jnp.interfaces.NamingContextFactory PROVIDER_URL

java.naming.provider.url=

jasmin.ics.agh.edu.pl:1099

try {

Context ctx = new InitialContext();

} catch (NamingException ne) {;}

Dostęp do metod Beana

try {

FortuneTellerSBHome home = (FortuneTellerSBHome)

ctx.lookup("java:/ejb/FortuneSB"); FortuneTellerSB fortuneTeller = home.create(); fortuneTeller.createFortune( „myfortune1” ); fortuneTeller.createFortune( „myfortune2” ); String myFortune = fortuneTeller.getFortune(); log( „ Found fortune:” + myFortune);} catch (NamingException e) {;} catch (CreateException e) {;}

Uruchomienie klientafortuneClient.jar FortuneClient FortuneSB FortuneSBHome

plik jbossall-client.jar zgodność wersji! {JBOSS_HOME}/client/

plik jndi.properties

java -classpath jbossall-client.jar;fortuneClient.jar edu.agh.dsrg.sius.fortune.FortuneClient

FortuneTeller - pokaz

kompletny kod uruchomienie i analiza wyjścia programu logów serwera aplikacji integracja z loggerem Jboss’a

JBoss – uruchomienie aplikacji

Tworzmy jar, ear (jak poprzednio)Konfigurujemy bazę danych

nazwa (taka jak w jbosscmp-jdbc.xml ) domyślnie DefaultDB - Hypersonic (hsqldb-ds.xml) Inne (Postgress, Oracle) –

pliki w {JBossRoot}/docs/examples/jca/*.xml ustawić parametry – host, port, hasło – i do katalogu

deploy

Klient się nie zmienia !!!!! – podstawa zaleta architektury wielowarstwowej

Projektowanie CMP - uwagi

Dostęp bezpośredni – specyfikacja zezwala ale nie używać – uzywać Fasady SesyjnejPrzesyłanie danych – wzorzec Value ObjectGenerowanie kluczy głównychXDoclet – programowanie deklaratywne - recepta na wiele ale nie na brak wiedzy

W EJB 3.0 wykorzystywane są tzw. anotacje