Presentation is loading. Please wait.

Presentation is loading. Please wait.

Enterprise Java v131013EJB: Session Beans1. Enterprise Java v131013EJB: Session Beans2 Needs and JavaSE/EE Implementation Options.

Similar presentations


Presentation on theme: "Enterprise Java v131013EJB: Session Beans1. Enterprise Java v131013EJB: Session Beans2 Needs and JavaSE/EE Implementation Options."— Presentation transcript:

1 Enterprise Java v131013EJB: Session Beans1

2 Enterprise Java v131013EJB: Session Beans2 Needs and JavaSE/EE Implementation Options

3 Enterprise Java v131013EJB: Session Beans3 Goals Be able to deploy business logic to the EJB tier –hosted by the container resource management threading security transactions remote interfaces async capabilities –accessed by other local business logic and local web tier –accessed by remote clients

4 Enterprise Java v131013EJB: Session Beans4 Objectives Rationale Stateless Session Bean –Stateless –Stateful –Singleton Enterprise Archives (EARs) Example Session Bean Interface Design Issues –Lazy Load –Pure POJOs –DTO Classes

5 Enterprise Java Overview Entity Beans –model business data in system Session Beans –model interactions between other beans –Taskflow Enterprise Archive (EAR) –Deployment artifact with a specific structure containing EJB component(s) WAR component(s) Utility jar(s) … v131013EJB: Session Beans5

6 Enterprise Java v131013EJB: Session Beans6 Associated Design Patterns Session Façade (covered in Business Logic) Remote Façade Data Transfer Objects

7 Enterprise Java v131013EJB: Session Beans7 Remote Facade Forces –core service layer (business logic and its business objects) contains fine grain methods and objects –a significant number of fine-grain remote calls will not work Solution –add a Remote Facade a course-grain facade over a service layer contains no business logic; it calls it translates course-grain methods and objects into fine-grain method calls and objects to/from service layer bulk accessors wrap fine-grain access methods –service layer does not have a remote interface fine grain business objects used might not be Serializable

8 Enterprise Java v131013EJB: Session Beans8 Remote Facade Encapsulates Local Objects

9 Enterprise Java v131013EJB: Session Beans9 Remote Facade Encapsulates Local Logic

10 Enterprise Java v131013EJB: Session Beans10 DTO Pattern Context –Business Objects represent too much information or behavior to transfer to remote client Problem –Client may get information they don't need –Client may get information they can't handle –Client may get information they are not authorized to use –Client may get too much information/behavior to be useful (e.g., entire database serialized to client) Forces –Some clients are local and can share object references with business logic –Handling specifics of remote clients outside of core scope of business logic

11 Enterprise Java v131013EJB: Session Beans11 DTO/Remote Facade Solution Layer a Remote Facade over Business Logic Remote Facade constructs Data Transfer Objects (DTOs) from Business Objects that are appropriate for remote client view Remote Facade uses DTOs to construct or locate Business Objects to communicate with Business Logic

12 Enterprise Java v131013EJB: Session Beans12 DTO Pattern Roles Data Transfer Object –represent a subset of the state of the application at a point in time –not dependent on Business Objects or server-side technologies doing so would require sending Business Objects to client XML and Web services provide the “ultimate isolation” in DTO implementation Remote Facade –uses Business Logic to perform core business logic –layered on to of Business Logic to translate between Business Objects and DTOs Business Logic –continues to perform core duties as described in DAO Pattern

13 Enterprise Java v131013EJB: Session Beans13 DTO Pattern Consequences Clients only get what they need Clients only get what they understand Clients only get what they are authorized to use Remote and Local interfaces to services are different –makes it harder to provide location transparency Lightweight Business Objects can be used as DTOs –Remote Facade must make sure they are “pruned” of excess related items before transferring to client –Remote Facade must make sure they are “cleaned” of DAO persistence classes before transferring to client

14 Enterprise Java v131013EJB: Session Beans14 Use Cases and Session Beans Session Bean per Use Case too fine grain –CreateAccountEJB –DepositEJB –WithdrawEJB –TransferEJB Group cohesive Use Cases into a larger-grain Session Bean –TellerEJB createAccount(), deposit(), withdraw(), transfer()

15 Enterprise Java v131013EJB: Session Beans15 Use of Session versus Entity Beans Session Beans –implementation of a task –interaction between other beans –direct database access bulk operations –examples TaxDistrict.calcTax(double cost) Teller.transfer(long fromAccount, long toAccount, double amount) Registrar.listStudents(String course)

16 Enterprise Java v131013EJB: Session Beans16 Use of Session versus Entity Beans (cont.) Entity Beans –represent shared data in the database –provide a type-safe, complete view of shared information –interacts with data generally at the individual object/row level –examples Account, Student Account.setOwner(String taxId), Account.getOwner() Account.withdraw(double amount), Account.deposit(double amount)

17 Enterprise Java v131013EJB: Session Beans17 Stateless Session Bean maintains no conversational state –each method is ignorant of what went before it and what will happen after it maintains implementation state –sharable between separate client invocations a set of procedures or batch commands that take in a set of parameters and return a result

18 Enterprise Java v131013EJB: Session Beans18 Stateful Session Bean maintains conversational state –object can cache values between calls ex. iterator –idle timeout period or client command ends lifetime maintains implementation state –not sharable between separate clients/objects all resources are allocated to perform the work of one Stateful Session bean instance. That instance is tied to the state of the client able to react to transaction states –ex. Publish error message on transaction rollback

19 Enterprise Java Singleton Session Bean Stateful session bean with only one instance shared across all clients Good for tracking transient state in-memory v131013EJB: Session Beans19

20 Enterprise Java v131013EJB: Session Beans20 Stateless/Stateful/Singleton Stateless –can contain cached implementations JDBC DataSources JMS Publishers cached EAI state all non-visible to calling client Stateful –may contain all of the above and add client conversational state Singleton –May contain all of the above except client conversation state would be shared across clients e.g., getNextTask()

21 Enterprise Java v131013EJB: Session Beans21 Stateless/Stateful/Singleton Stateless –Cheapest to implement, deploy, scale Stateful –should only be used within the scope of a single HttpRequest –should not be used at HttpSession Scope multiple threads would access same instance Singleton –Newest bean type –More overhead than stateless because of concurrency management –Extremely efficient when managing in-memory state

22 Enterprise Java v131013EJB: Session Beans22 Stateless Session Bean Lifecycle

23 Enterprise Java v131013EJB: Session Beans23 Stateful Session Bean Lifecycle

24 Enterprise Java v131013EJB: Session Beans24 Singleton Session Bean Lifecycle

25 Enterprise Java JavaEE EARs Used for compound deployments –Multiple EJBs –Multiple WARs –EJB + WAR Optional with new JavaEE 6 “flexible deployment” and the first and last case above –WAR EJB(s) v131013EJB: Session Beans25

26 Enterprise Java v131013EJB: Session Beans26 Class Loaders Arranged in a parent/child relationship Requests for a class are first delegated to the parent class loader May access classes/resources loaded by local and parent class loader Do not have access to classes/resources loaded by sibling class loaders Parent Class Loader Child Class Loader

27 Enterprise Java 27 Application Server Class Loader EJB App Class Loader Web App Class Loader Web App Class Loader Separate EJB/WAR Deployment Classes loaded by EJB Application Class Loader not seen by Web Application Shared implementations must be placed in both applications –WEB-INF/lib –causes difficulty when passing object between applications that have loaded the same class v131013EJB: Session Beans

28 Enterprise Java v131013EJB: Session Beans28 J2EE Enterprise Application Deployment Application Server Class Loader EAR Class Loader EJB App Class Loader EAR Class Loader Web App 2 Class Loader Web App 1 Class Loader Servlets/JSPs and lib.jars loaded by isolated classloaders All EJBs are loaded by a single class loader may also include web dependent classes identified through manifest entries to promote singleton loading of classes across web applications EJB interfaces and dependent classes identified by EJB manifests loaded by EAR’s classloader

29 Enterprise Java v131013EJB: Session Beans29 Enterprise Application Archive (EAR) WAR(s) –directory or archive EJB(s) –directory or archive Client JAR(s) –client applications Utility Classes(s) –directory or archive –supplies external source utility classes –referenced through MANIFESTs Resource Adapters(s) –custom resource drivers WAR EJB EAR META-INF/application.xml Utility Classes Resource Adapter Resource Adapter Resource Adapter Client App Client App Client App Utility Classes Utility Classes

30 Enterprise Java v131013EJB: Session Beans30 Directory and Archive Forms Exploded Directory Form –ability to modify static files (html/jsp) without redeploying –separate server serves up content in exploded form –simpler build environment consistent with build environment of free versions of IDEs (Forte, JBuilder, etc.) Archive File Format – easy form of distribution

31 Enterprise Java v131013EJB: Session Beans31 application icon small-iconlarge-icon display-namedescription?module+security-role* ejb|connector|java|webalt-dd web-uricontext-root description? role-name application.xml

32 Enterprise Java v131013EJB: Session Beans32 Key Element Definitions Modules –ejb – EJBs (Ex. EJB1.jar) –web – web applications –java - client applications –connector – JCA resource adapters Web applications –web-uri (ex. webapp1.war) –context-root Name of web app’s context May be empty if only one webapp in the application

33 Enterprise Java v131013EJB: Session Beans33 application.xml Example <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> ejbsessionBankEAR Example Session Bean Bank Application ejbsessionBankWAR.war /ejbsessionBankWAR ejbsessionBankEJB-1.0.2007.2-SNAPSHOT.jar

34 Enterprise Java v131013EJB: Session Beans34 Example: Core Implementation ejbsessionBankImpl/target/classes |-- META-INF | `-- orm.xml `-- ejava `-- examples `-- ejbsessionbank |-- bl | |-- BankException.class | `-- Teller.class |-- blimpl | `-- TellerImpl.class |-- bo | |-- Account.class | |-- Ledger.class | `-- Owner.class |-- dao | |-- AccountDAO.class | |-- DAOException.class | `-- OwnerDAO.class `-- jpa |-- JPAAccountDAO.class `-- JPAOwnerDAO.class * Note: we are not including a JavaSE persistence.xml in Impl

35 Enterprise Java v131013EJB: Session Beans35 Example Session Bean: Business Interface package ejava.examples.ejbsessionbank.bl; import java.util.List; import ejava.examples.ejbsessionbank.bo.Account; import ejava.examples.ejbsessionbank.bo.Ledger; public interface Teller { Account createAccount(String accNum) throws BankException; Account getAccount(String acctNum) throws BankException; Account closeAccount(String acctNum) throws BankException; void updateAccount(Account account) throws BankException; List getOverdrawnAccounts(int index, int count) throws BankException; List getAccounts(int index, int count) throws BankException; Ledger getLedger() throws BankException; }

36 Enterprise Java v131013EJB: Session Beans36 Example: EJB ejbsessionBankEJB/target/classes |-- ejava | `-- examples | `-- ejbsessionbank | |-- dto | | `-- OwnerDTO.class | `-- ejb | |-- Stats.class | |-- StatsEJB.class | |-- StatsLocal.class | |-- StatsRemote.class | |-- TellerEJB.class | |-- TellerLocal.class | `-- TellerRemote.class `-- META-INF |-- ejb-jar.xml `-- persistence.xml * Note: We are providing a JavaEE persistence.xml in the EJB

37 Enterprise Java v131013EJB: Session Beans37 Example Session Bean: Local and Remote Interfaces package ejava.examples.ejbsessionbank.ejb; import ejava.examples.ejbsessionbank.bl.Teller; @javax.ejb.Local public interface TellerLocal extends Teller { } package ejava.examples.ejbsessionbank.ejb; import ejava.examples.ejbsessionbank.bl.Teller; @javax.ejb.Remote public interface TellerRemote extends Teller { } * Warning – although business interfaces can be used for both local and remote interfaces, this only works for simple data models – more later

38 Enterprise Java v131013EJB: Session Beans38 Example Session Bean: Bean Class package ejava.examples.ejbsessionbank.ejb; import javax.annotation.*; import javax.ejb.*; import javax.persistence.*;... @Stateless public class TellerEJB implements TellerLocal, TellerRemote { private static final Log log =... @Resource protected SessionContext ctx; @PersistenceContext(unitName="ejbsessionbank") protected EntityManager em; @Resource(name="daoClass") protected String daoClassName; protected Teller teller; Stateless

39 Enterprise Java v131013EJB: Session Beans39 Example Session Bean: Bean Class @PostConstruct public void init() { log.debug("init(), daoClass=" + daoClassName); teller = new TellerImpl(); try { AccountDAO dao = (AccountDAO)Thread.currentThread() //just a partial example of resolving.getContextClassLoader() //a property supplied.loadClass(daoClassName) //by the container.newInstance(); ((JPAAccountDAO)dao).setEntityManager(em); ((TellerImpl)teller).setAcctDAO(dao); OwnerDAO ownerDAO = new JPAOwnerDAO(); ((JPAOwnerDAO)ownerDAO).setEntityManager(em); ((TellerImpl)teller).setOwnerDAO(ownerDAO); } catch (Exception ex) { log.fatal("error loading dao class:" + daoClassName, ex); throw new EJBException("error loading dao class:" + daoClassName + ", " + ex); } @PreDestroy public void close() {... }

40 Enterprise Java v131013EJB: Session Beans40 Example Session Bean: Bean Class public Account createAccount(String accountNumber) throws BankException{ try { return teller.createAccount(accountNumber); } catch (AccountDAOException ex) { ctx.setRollbackOnly(); log.fatal("internal error creating account", ex); throw new BankException("internal error creating account:"+ ex); } Log details of exception locally on server-side Provide de-serializable message to client

41 Enterprise Java v131013EJB: Session Beans41 Example Session Bean: ejb-jar.xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1"> TellerEJB daoClass java.lang.String ejava.examples.ejbsessionbank.jpa.JPAAccountDAO... Watch out for !!!

42 Enterprise Java v131013EJB: Session Beans42 Example Session Bean: persistence.xml <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> org.hibernate.ejb.HibernatePersistence java:jboss/datasources/ExampleDS lib/ejbsessionBankImpl-${project.version}.jar <property name="hibernate.dialect" value="${hibernate.dialect}"/>

43 Enterprise Java Example Singleton Session Bean: Local and Remote Interfaces package ejava.examples.ejbsessionbank.ejb; public interface Stats { void open(); void close(); int getTotal(); int getDelta(); void reset(); } package ejava.examples.ejbsessionbank.ejb; @javax.ejb.Local public interface StatsLocal extends Stats { } package ejava.examples.ejbsessionbank.ejb; @javax.ejb.Remote public interface StatsRemote extends Stats { } v131013EJB: Session Beans43

44 Enterprise Java Example Singleton Session Bean: Bean Class Setup package ejava.examples.ejbsessionbank.ejb; @javax.ejb.Singleton @javax.ejb.Startup @javax.ejb.ConcurrencyManagement( javax.ejb.ConcurrencyManagementType.CONTAINER) @javax.ejb.AccessTimeout(value=3000) public class StatsEJB implements StatsLocal, StatsRemote { private static final Log log =... private int delta; private int total; @javax.annotation.PostConstruct log.info("*** StatsEJB ***"); } v131013EJB: Session Beans44 (Stateful)

45 Enterprise Java Example Singleton Session Bean: Write/Read Methods @Override @javax.ejb.Lock( javax.ejb.LockType.WRITE) public void open() { this.delta += 1; this.total += 1; } @Override @Lock(LockType.WRITE) public void close() { this.delta -= 1; this.total += 1; } @Override @Lock(LockType.WRITE) public void reset() { delta=0; total=0; } @Override @Lock(LockType.READ) public int getTotal() { return total; } @Override @Lock(LockType.READ) public int getDelta() { return delta; } v131013EJB: Session Beans45

46 Enterprise Java v131013EJB: Session Beans46 Example: RMI Test ejbsessionBankTest/target/test-classes |-- ejava | `-- examples | `-- ejbsessionbank | `-- ejbclient … | |-- TellerEJBClientIT.class | |-- TellerRemotingIT.class | |-- TellerOwnerEJBClientIT.class | `-- TellerOwnerRemotingIT.class |-- jboss-ejb-client.properties |-- jndi.properties `-- log4j.xml JUnit Test Types *Test = unit tests run by surefire plugin *IT = integration tests run by failsafe plugin

47 Enterprise Java Remoting JNDI Tree (Internally Accessible) java:global/ejbsessionBankEAR/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerLocal java:app/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerLocal java:module/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerLocal java:global/ejbsessionBankEAR/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote java:app/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote java:module/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote JNDI Tree (externally Accessible) java:jboss/exported/ejbsessionBankEAR/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote jndi.properties java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.factory.url.pkgs= java.naming.provider.url=remote://127.0.0.1:4447 java.naming.security.principal=known java.naming.security.credentials=password jboss.naming.client.ejb.context=true External JNDI Name ejbsessionBankEAR/ejbsessionBankEJB/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote v131013EJB: Session Beans47 Generic naming mechanism Works identical with non-EJB resources Ignorant of EJB details Less Efficient Being deprecated by JBoss in favor of EJB Client

48 Enterprise Java JUnit Integration Test (IT) public class TellerRemotingIT { private static final Log log =... protected Teller teller; @Before public void setUp() throws Exception { InitialContext jndi = new InitialContext(); teller = (TellerRemote)jndi.lookup(jndiName); } @Test public void testCreateAccount() throws Exception { log.info("*** testCreateAccount ***"); Account account=null; //try with what should be a unique number try { account = teller.createAccount("1234"); log.debug("account created:" + account); } catch (Exception ex) { log.fatal("error creating account:" + ex, ex); fail("error creating account:" + ex); } v131013EJB: Session Beans48 JNDI Properties being supplied through jndi.properties file -or- through a Properties object

49 Enterprise Java EJBClient jndi.properties java.naming.factory.initial= java.naming.factory.url.pkgs=org.jboss.ejb.client.naming java.naming.provider.url= java.naming.security.principal= java.naming.security.credentials= jboss-ejb-client.properties #top level property listing the names of the connections. There will be a set #of properties for each name listed here remote.connections=default #here we define the properties for the server we have called "default" remote.connection.default.host=127.0.0.1 remote.connection.default.port=4447 remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false External JNDI Name ejb:(ear)/(module)/(distinctName)/(ejbClass)!(remoteInterface)[?stateful] ejb:ejbsessionBankEAR/ejbsessionBankEJB/””/TellerEJB!ejava.examples.ejbsessionbank.ejb.TellerRemote v131013EJB: Session Beans49 EJB-specific naming mechanism Does not work with non-EJB resources Aware of EJB details More efficient than Remoting Non-standard

50 Enterprise Java v131013EJB: Session Beans50 Lazy Load Issues EJB public List getOwners(int index, int count) { return teller.getOwners(index, count); RMI Test List owners = teller.getOwners(0, 100); assertEquals("unexpected number of owners", 2, owners.size()); for(Owner o : owners) { for (Account a: o.getAccounts()) { //LINE 87... } Error org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ejava.examples.ejbsessionbank.bo.Owner.accounts, no session or session was closed... org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersisten tCollection.java:86) at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249) at ejava.examples.ejbsessionbank.ejbclient.TellerOwnerRemoteTest.testLazy(Telle rOwnerRemoteTest.java:87)

51 Enterprise Java v131013EJB: Session Beans51 Lazy Load Correction EJB Remote @Remote public interface TellerRemote extends Teller { List getOwnersLoaded(int index, int count) throws BankException; } EJB public List getOwnersLoaded(int index, int count) throws BankException { List owners = getOwners(index, count); for(Owner owner : owners) { for (Account account : owner.getAccounts()) { account.getBalance(); //call a method to get loaded } return owners; } RMI Test List owners = teller.getOwnersLoaded(0, 100); SELECT o FROM Owner o LEFT JOIN FETCH o.accounts Alt: DAO JPAQL Query public class Owner { @OneToMany(fetch=EAGER) private List accounts; Alt: relation fetch mode

52 Enterprise Java v131013EJB: Session Beans52 Non-POJO Class Issues EJB public List getOwnersLoaded(int index, int count) throws BankException { List owners = getOwners(index, count); for(Owner owner : owners) { for (Account account : owner.getAccounts()) { account.getBalance(); //call a method to get loaded } return owners; } RMI Test List owners = teller.getOwnersLoaded(0, 100); for(Owner o : owners) { for (Account a: o.getAccounts()) { log.info("account=" + a); } log.debug("addresses=" + o.getAccounts().getClass().getName()); assertTrue("unexpected collection class", o.getAccounts().getClass().getName().contains("hibernate")); } Output -account=id=2, acctnum=111, bal=$0.0 -addresses=org.hibernate.collection.PersistentBag

53 Enterprise Java v131013EJB: Session Beans53 Non-POJO Class Correction EJB public List getOwnersPOJO(int index, int count)... List ownersPOJO = new ArrayList (); for(Owner owner : getOwners(index, count)) { Owner ownerPOJO = new Owner(owner.getId()); ownerPOJO.setFirstName(owner.getFirstName()); ownerPOJO.setLastName(owner.getLastName()); ownerPOJO.setSsn(owner.getSsn()); for (Account account : owner.getAccounts()) { Account accountPOJO = new Account(account.getId()); accountPOJO.setAccountNumber(account.getAccountNumber()); accountPOJO.deposit(account.getBalance()); ownerPOJO.getAccounts().add(accountPOJO); } ownersPOJO.add(ownerPOJO); } return ownersPOJO; } RMI Test owners = teller.getOwnersPOJO(0, 100);... log.debug("addresses=" + o.getAccounts().getClass().getName()); assertFalse("unexpected collection class", o.getAccounts().getClass().getName().contains("hibernate")); Output -account=id=2, acctnum=111, bal=$0.0 -addresses=java.util.ArrayList

54 Enterprise Java v131013EJB: Session Beans54 BO Complexity Class Issues Business Object public class Owner implements Serializable { private long id; private String firstName; private String lastName; private String ssn; private Collection accounts = new ArrayList ();...

55 Enterprise Java v131013EJB: Session Beans55 BO Complexity Correction DTO Class public class OwnerDTO implements Serializable { private static final long serialVersionUID = 1L; private long id; private String firstName; private String lastName; private int accounts;... EJB public List getOwnersDTO(int index, int count) throws BankException { List ownersDTO = new ArrayList (); for(Owner owner : getOwners(index, count)) { OwnerDTO ownerDTO = new OwnerDTO(owner.getId()); ownerDTO.setFirstName(owner.getFirstName()); ownerDTO.setLastName(owner.getLastName()); ownerDTO.setAccounts(owner.getAccounts().size()); ownersDTO.add(ownerDTO); } return ownersDTO; } RMI Test List owners = teller.getOwnersDTO(0, 100);

56 Enterprise Java v131013EJB: Session Beans56 Building EJBs with Maven

57 Enterprise Java v131013EJB: Session Beans57 Parent Project |-- ejbsessionBankBLImpl |-- ejbsessionBankEAR |-- ejbsessionBankEJB |-- ejbsessionBankTest `-- pom.xml

58 Enterprise Java v131013EJB: Session Beans58 Parent Project ejava ejava-root 3.0.2012.2-SNAPSHOT 4.0.0 ejava.javaee.ejb ejbsessionBank pom EJB Session Bean Bank This project is the root project for the core session bean example. ejbsessionBankImpl ejbsessionBankEJB ejbsessionBankWAR ejbsessionBankEAR ejbsessionBankTest

59 Enterprise Java v131013EJB: Session Beans59 EJB Project ejbsessionBankEJB/src/ `-- main |-- java | `-- ejava | `-- examples | `-- ejbsessionbank | |-- dto | | `-- OwnerDTO.java | `-- ejb | |-- StatsEJB.java | |-- Stats.java | |-- StatsLocal.java | |-- StatsRemote.java | |-- TellerEJB.java | |-- TellerLocal.java | `-- TellerRemote.java `-- resources `-- META-INF |-- ejb-jar.xml |-- persistence.xml `-- (jboss-ejb3.xml)

60 Enterprise Java v131013EJB: Session Beans60 EJB Project pom.xml: ejb Packaging ejbsessionBank ejava.javaee.ejb 3.0.2012.2-SNAPSHOT.. 4.0.0 ejbsessionBankEJB ejb Session Bank EJB This project provides an example of the core properties of a session bean.

61 Enterprise Java v131013EJB: Session Beans61 EJB Project: dependencies commons-logging provided javax javaee-api provided ${project.groupId} ejbsessionBankImpl ${project.version} provided

62 Enterprise Java v131013EJB: Session Beans62 EJB Project: plugins <!--tell the resource plugin to perform filtering on resources to fill in dialect, etc. --> src/main/resources true org.apache.maven.plugins maven-ejb-plugin true **/ejb/*Local.class **/ejb/*EJB.class

63 Enterprise Java v131013EJB: Session Beans63 EJB Project: profiles h2db org.h2.Driver jdbc:h2:${basedir}/target/h2db/ejava sa org.hibernate.dialect.H2Dialect...

64 Enterprise Java v131013EJB: Session Beans64 EJB Project: persistence.xml <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> org.hibernate.ejb.HibernatePersistence java:jboss/datasources/ExampleDS <property name="hibernate.dialect" value="${hibernate.dialect}"/> After filtering <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

65 Enterprise Java v131013EJB: Session Beans65 EAR Project ejbsessionBankEAR/ `-- pom.xml pom.xml ejbsessionBank ejava.javaee.ejb 3.0.2012.2-SNAPSHOT.. 4.0.0 ejbsessionBankEAR ear Session Bank EAR

66 Enterprise Java 66 EAR Project (cont.): dependencies ${project.groupId} ejbsessionBankEJB ${project.version} ejb commons-logging ${project.groupId} ejbsessionBankWAR ${project.version} war ${project.groupId} ejbsessionBankImpl ${project.version} commons-logging v131013EJB: Session Beans

67 Enterprise Java v131013EJB: Session Beans67 EAR Project (cont.): plugins org.apache.maven.plugins maven-ear-plugin Example Session Bean Bank Application lib ${project.artifactId} ${project.groupId} ejbsessionBankWAR ejbsessionBank ${project.groupId} ejbsessionBankEJB ejbsessionBankEJB.jar

68 Enterprise Java v131013EJB: Session Beans68 EAR Project (cont.) Use cargo plugin to undeploy built and deployed EARs undeploy org.codehaus.cargo cargo-maven2-plugin undeploy-ear pre-clean undeploy

69 Enterprise Java v131013EJB: Session Beans69 EAR Project (cont.) ejbsessionBankEAR/target/ejbsessionBankEAR-3.0.2012.2-SNAPSHOT |-- ejbsessionBankEJB.jar |-- ejbsessionBankWAR-3.0.2012.2-SNAPSHOT.war |-- lib | |-- ejava-util-3.0.2012.2-SNAPSHOT.jar | `-- ejbsessionBankImpl-3.0.2012.2-SNAPSHOT.jar `-- META-INF `-- application.xml

70 Enterprise Java v131013EJB: Session Beans70 RMI Test Project ejbsessionBankTest/ |-- pom.xml `-- src |-- main `-- test |-- java | `-- ejava | `-- examples | `-- ejbsessionbank | `-- ejbclient | |-- TellerOwnerRemoteTest.java | `-- TellerRemoteTest.java `-- resources |-- jndi.properties `-- log4j.xml pom.xml ejbsessionBank ejava.javaee.ejb 3.0.2012.2-SNAPSHOT.. 4.0.0 ejbsessionBankTest jar Session Bank Test

71 Enterprise Java v131013EJB: Session Beans71 RMI Test Project (cont.)... ${project.groupId} ejbsessionBankEJB ${project.version} ejb-client test ${project.groupId} ejbsessionBankEAR ${project.version} ear compile ejava.common jboss-rmi-client ${project.version} pom test...

72 Enterprise Java v131013EJB: Session Beans72 RMI Test Project (cont.): plugins org.codehaus.cargo cargo-maven2-plugin ${project.groupId} ejbsessionBankEAR ear org.apache.maven.plugins maven-failsafe-plugin ${foovar}

73 Enterprise Java v131013EJB: Session Beans73 Summary Integrates Bean activity (“task script”) Server-side code for client –Stateless and Stateful Server-side cache for client –Stateful POJO with minor amount of class metadata

74 Enterprise Java v131013EJB: Session Beans74 References “Enterprise JavaBeans 3.0, 5 th Edition”; Burke & Monsen-Haefel; ISBN 0-596-00978-X; O'Reilly “Mobile Design Patterns and Architectures”, http://www.titu.jyu.fi/modpa/ (MODPA) http://www.titu.jyu.fi/modpa/ –Remote Facade http://www.titu.jyu.fi/modpa/Patterns/pattern- RemoteFacade.htmlhttp://www.titu.jyu.fi/modpa/Patterns/pattern- RemoteFacade.html “Patterns of Enterprise Archecture, Chapter 15: Remote Facade”; Martin Fowler –http://www.theserverside.com/tt/articles/content/FowlerP atterns/Fowler_ch15.pdf


Download ppt "Enterprise Java v131013EJB: Session Beans1. Enterprise Java v131013EJB: Session Beans2 Needs and JavaSE/EE Implementation Options."

Similar presentations


Ads by Google