J2EE - Java Connector Architecture

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.



Imre Gábor — gabor@aut.bme.hu - 2006.10.27.
Szabó Roland, szabo.roland@aut.bme.hu - 2006.11.29.

Resource Adapter segjtsegevel elkerulheto, hogy MxN kodot kelljen irni M Java es N legacy alkalmazas osszekapcsolasahoz. A Resource Adapter interfeszt nyujt az EJB es a middleware szolgaltatasok (security, tranzakcio kezeles) fele.

Inicializalas

  • NetBeans 5.5-ben Runtime / Servers / Sun Java System Application Server / Start
  • Nyissuk meg es inditsuk el a
    Ezen a helyen volt linkelve a(z) bankapp.tar.gz nevű fájl ("BankApp" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoszak/IIRLaborJ2EE oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
alkalmazast
    • Build, majd java -jar ~/BankApp/dist/BankApp.jar
  • Ellenorizzuk, hogy telnetrol vezerelheto a program
    • telnet zoneX 6789<br>ok<br>login asdfg<br>ok
    • Parancsok: login, createfa, remove, deposit, withdraw
    • A fizikai kapcsolatot (socket) a BankClient projektben a BankConnection.java biztositja. Itt forditja le a parancsokat TCP uzenetekre.
  • Nyissuk meg a
    Ezen a helyen volt linkelve a(z) bankclient.tar.gz nevű fájl ("BankClient" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoszak/IIRLaborJ2EE oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)

es a

Ezen a helyen volt linkelve a(z) bankadapter.tar.gz nevű fájl ("BankAdapter" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoszak/IIRLaborJ2EE oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
alkalmazasokat is
  • BankAdapteren jobb click, Resolve Reference Problems
    • j2ee.jar helye: sun/SUNWappserver/lib/j2ee.jar
  • validaljuk a Files / BankAdapter / ra.xml file-t, elotte at kell irni az xsi:schemaLocation-t
  • Projects / BankAdapter / Build ket hibat jelez, javitsuk ki az IOException-t es a BankException-t sima Exception-re
  • Inditsuk el az admin konzolt:
    • zonan belulrol: /usr/sfw/bin/mozilla
    • vagy: Runtime / Servers / Sun Java System Application Server / View Admin Console
      • ha nem megy: Tools / Options / Advanced Options / Server and External Tool Settings / Web Browsers / Mozilla / Browser Executable = /usr/sfw/lib/mozilla/mozilla
    • user: admin, password: adminadmin
  • Connector Modules, Deploy..., File to upload: BankAdapter / dist / BankAdapter.rar; Next; Finish

BankAdapter

BankResourceAdapter.java

  • start(BootstrapContent ctx)
    • ctx.getWorkManager(): uj szalat indithatunk vele (maskepp nem szabad!)
    • ctx.createTimer(): timert hoz letre
  • endpointActivation: jelzi az appszerver fele, hogy egy message-driven bean figyel
  • endpointDeactivation: message-driven bean leallt

Files / BankAdapter / ra.xml

Resource adapter descriptora

  • <resourceadapter-class> melyik osztaly implementalja a resource adaptert
  • <reauthentication-support>: arra kell, hogy egy kapcsolatot ujra fel lehessen hasznalni, azaz be lehessen jelentkeztetni egy masik felhasznalot.
  • <connection-definition&gt: az interfeszeket es az implementacios osztalyokat kell itt megadni
    • <managedconnection-factory>: az alkalmazassszervernek gyart kapcsolatokat
    • <connectionfactory-interface>: a kliensnek szol
    • <connectionfactory-impl>: az alkalmazasszervernek szol
    • <connection-interface>: a kapcsolat interfesze (Bank)
    • <transaction-support>: szukseg van-e tranzakciokezelesre

BankFactory.java, BankFactoryImpl.java

  • Referencable interfesz: arra kell, hogy az objektum belekerulhessen a JNDI-be
  • Kapcsolat letrehozasanak lepesei
    1. EJB: lookup ResourceAdapter
    2. getBank(): kerunk egy Bank interfeszu menedzselt kapcsolatot. Azert
    3. a getBank() ker a connection pool-bol egy menedzselt kapcsolatot a ManagedConnectionFactory-tol: manager.allocateConnection(factory, null)
    4. a pool ker a ResourceAdaptertol egy fizikai kapcsolatot es azt adja vissza

ManagedConnectionImpl.java

  • Az alkalmazasszervernek hoz letre kapcsolatot, ezert implementalnia kell a ManagedConnection interfeszt
  • Ha tranzakciot akarunk tamogatni, kell egy LocalTransaction interfesz. Az alkalmazasszerver fogja hivni a begin(), commit() es rollback() metodusokat, ha az ra.xml-ben be van kapcsolva a tranzakciokezeles.
  • A getConnection() metodus
    • ker egy fizikai kapcsolatot a BankConnection-tol: super.connect(InetAddress.getByName(host), port);
    • ha a kapcsolat nem uj, kilepteti a felhasznalot: super.logout();
    • es belepteti az aktualis felhasznalot: super.login(name);
  • destroy() metodus: az alkalmazas szerver hivja, megvalositas: super.exit()
  • cleanup() metodus: az alkalmazas szerver hivja, ha ujra akarunk hasznalni egy kapcsolatot
  • shutdown() metodus: sajat, lezarja a kapcsolatot es ertesiti rola az alkalmazasszervert
  • exit() metodus: nem az eredeti exit() hivodik, ami lezarja a kapcsolatot, csak visszarakja a poolba

ManagedConnectionFactoryImpl.java

  • Ez egy SPI interfesz: az alkalmazasszerver fele nyujt szolgaltatasokat
  • createConnectionFactory() metodusbol van menedzselt es nativ valtozat is, az elobbit hasznaljak J2EE alkalmazasbol. Implementacio: return new BankFactoryImpl(this, connectionManager);
  • createManagedConnection() implementacioja: return new ManagedConnectionImpl(host, port);\
  • matchManagedConnections(): ha a kapcsolatok egy felhasznalo szamara vannak dedikalva, ez a metodus adja vissza a felhasznalohoz tartozo kapcsolatot. Ha null-lal ter vissza, az alkalmazasszerver letrehoz egy uj kapcsolatot. Jelenleg minden kapcsolat egyenerteku, visszaterunk az elsovel:
    if (set.isEmpty()) return null; else return (ManagedConnection)set.iterator().next();

Resource adapter hivasok EJB-bol

Egeszitsuk ki a BankEJB projektben a BankBean.java-t

ejbCreate()

Object o = c.lookup(":java:comp/env/BankPool");
bankFactory = (BankFactory)
	 PortableRemoteObject.narrow(o, BankFactory.class);

createAccount()

bank = bankFactory.getBank();
bank.create(account);

Ha hiba tortent, rollback: context.setRollbackOnly(). Ha RuntimeException-t dobunk, az alkalmazasszerver automatikusan rollbackel, de ha BankException, tovabbdobja.

removeAccount()

bank = bankFactory.getBank();
bankFactory.remove(account)

deposit()

bank = bankFactory.getBank();
bank.deposit(account, amount);

withdraw()

bank = bankFactory.getBank();
bank.withddraw(account, amount);

transfer()

bank = bankFactory.getBank();
bank.deposit(toAccount, amout)
bank.withdraw(fromAccount, amount);

Azert irtuk ilyen sorrendbe, hogy ki tudjuk probalni a rollback-et.

getAccounts()

bank = bankFactory.getBank();
return bank.getAccounts();

Connection pool es JNDI konfiguracio

  • Nyissuk meg a
    Ezen a helyen volt linkelve a(z) bankenterprise.tar.gz nevű fájl ("BankEnterprise" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoszak/IIRLaborJ2EE oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
alkalmazast
  • Oldjuk fel a referencia problemakat
  • Resources / Connectors / Connector Connection Pools / New...
    • Name: BankConnectionPool
    • Resource Adapter: BankAdapter
    • Connection Definition: bank.adapter.BankFactory
    • Initial and Minimum Pool Size: 2
    • Maximum Pool Size: 4
    • Transaction Support: NoTransaction vagy LocalTransaction attol fuggoen, hogy az ra.xml-ben engedelyeztuk-e a tranzakciokat
    • Host: localhost
    • Port: 6789
  • Resources / Connectors / Connector Resources / New...
    • JNDI Name: BankPool
    • Pool Name: BankConnectionPool
  • Projects / BankEJB / Configuration Files / sun-ejb-jar.xml
    • Sun Configuration / BankBean [EJB] / BankPool [Resource Reference] JNDI nevet ellenorizzuk, hogy BankPool-ra van-e allitva

Futtatas

  • BankBean-t egeszitsuk ki a megfelelo hivasokkal
  • Build, majd admin konzolon Redeploy
  • BankEnterprise / Run Project
    • url: http://localhost:8080/BankWeb/bank.jsp
    • Ha fura Exception-t dob szamla letrehozasakor, amibol nem latszik, hogy a mi hibank (pl. ClassCastException), buildeljuk ujra a BankAdaptert, redeploy az admin konzolon, inditsuk ujra a szervert, es run BankEnterprise

Security

  • Files / BankAdapter / ra.xml-bol toroljuk a security kommenteket
    • authentication-mechanism elementet helyezzuk at a transaction-support ala
  • BankWeb / Configuration Files / web.xml-bol is toroljuk a kommentet
  • BankEnterprise / sun-application.xml / admin
    • New Principal: user1
  • admin konzolon Configuration / Security / Realms / file
    • user1, pass1, pass1, group1
  • admin konzolon Resources / Connectors / Connector Connection Pools / BankPool / Security Maps / New...
    • Name: mymap
    • Principals: user1
    • Backend Principal / Username: user2
    • Backend Principal / Password: pass2

5 percenkent kerunk eletjelet a resource adaptertol

Felhasznalhato pl. arra is, hogy pollozzon egy email szervert.

<inbound-resourceadapter>
	<messageadapter>
		<messagelistener>
			<messagelistener-type>
				bank.adapter.HeartBeat
			</messagelistener-type>
			<activationspec>
				<activationspec-class>
					 bank.adapter.ActivationSpecImpl
				</activationspec-class>
				<required-config-property>
					<config-property-name>frequency</config-property-name>
				</required-config-property>
			</activationspec>
		<messagelistener>
	</messageadapter>
</inbound-resourceadapter>
package bank.adapter;

public interface HeartBeat {
	void beat();
}
package bank.adapter;

// ActivationSpec interfesza javaee.jar-ban van benne
public class ActivationSpecimpl implements ActivationSpec {

	private int frequency;

	public int getFrequency() {
		return frequency;
	}

	public int setFrequency(int frequency) {
		this.frequency = frequency;
	}
}

BankResourceAdapter.java-n belul:

MessageEndpointFactory factory;
Timer timer;

public void endpointActivation(MessageEndpointFactorey mef, ActivationSpec aspec) {
	factory = mef;
	ActivationSpecImpl i = (ActivationSpecImpl) aspec;
	timer = ctx.createTimer();  // java.util.Timer
	timer.scheduleAtFixedRate(new TimerTask() {
		public void run() {
			logger.log(Level.INFO, "Calling beat() on MDB");
			try {
				((Heartbeat) factory.createEndpoint(null)).beat();
			} catch (UnavailableException) {  // javax.resource.spi
				logger.severe(e.toString());
				timer.cancel();
			}
		}
	}, 0, i.getFrequency());
}

New / Message Driven bean: HeartMdb
ejb-jar.xml-ben <message-destination-type>-ot atirni bank.adapter.HeartBeat-re, <message-destination-link&gt nem kell.
Property-k koze beirni a frequency-t.

HeartMonitorBean implements MessageDrivenBean, HeartBeat

beat() {
	System.out.println("meg el");
}

Build, adaptert redeployolni az appszerveren, Enterprise projektet is ujra kell deployolni.

Onallo feladat

Egeszitsuk ki a bank szervert ugy, hogy tobb bank kozott tudjunk utalni. Ehhez letre kell hozni egy uj resource adaptert. Jelenleg nem tamogatjuk az XA (elosztott) tranzakciokezelest, ezert kapcsoljuk ki a tranzakciokat.

-- Peti - 2006.11.29.