ejb - laboratorium
Post on 02-Jan-2016
40 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
top related