Java a JEE - stuba.skpolasek/courses/ass-sk/files/JEEGirovsky.pdfJava™ Platform, Enterprise...

Preview:

Citation preview

Java a JEE

Peter Girovský IBM

● Čo je to JEE (J2EE)?● WebSphere Application Server (WAS)● WebSphere Application Server Network

Deployment koncept● Vysoká dostupnosť aplikácií a služieb v JEE

svete● JEE aplikácie a prevádzkové problémy v praxi

Obsah

Čo je JEE?

JEE špecifikácie (WAS 7)Špecifikácia alebo API Verzia

Java™ Platform, Enterprise Edition (Java EE) specification

Java EE 5J2EE 1.4J2EE 1.3

Java Platform, Standard Edition (Java SE) specification

Java SE 6 New

Java Servlet specification (JSR 154 and JSR 53) Java Servlet 2.5Java Servlet 2.4Java Servlet 2.3

JavaServer Faces (JSF) specification (JSR 252 and 127)

JSF 1.2

JavaServer Pages (JSP) specification (JSR 245, JSR 152, and JSR 53)

JSP 2.1 JSP 2.0JSP 1.2

Enterprise JavaBeans™ (EJB) specification EJB 3.0EJB 2.1EJB 2.0

Java DataBase Connectivity (JDBC) API JDBC 4.0JDBC 3.0JDBC 2.1

Java Message Service (JMS) specification JMS 1.1

WebSphere Application Server

WebShere 7 packaging

WebSphere base code

WebSphereApplication

Server Express

WebSphere base code

WebSphereApplication

Server

WebSphere base code

WebSphereApplication

Server Network Deployment

Licencia

Vysoká dostupnosťškálovateľnosť, centralizovaná

administrácia,..

WebSphere Application Server

● Platforma pre Java-based aplikácie● Implementácia JEE ● Poskytuje servisy pre aplikácie (threading, DB

connectivity, WLM,..)

Aplikácia

HW, OS, Databáza,storage, sieť

WebSphere Application Server (1/10)

WebSphere Application Server (2/10)

WebSphere Application Server (3/10)

WebSphere Application Server (4/10)

WebSphere Application Server (5/10)

WebSphere Application Server (6/10)

WebSphere Application Server (7/10)

WebSphere Application Server (8/10)

WebSphere Application Server (9/10)

WebSphere Application Server (10/10)

WebSphere Application Server Administrácia(1/3)

WebSphere Application Server Administrácia(2/3)

WebSphere Application Server Administrácia(3/3)

WebSphere Application ServerNetwork Deployment

koncept

Koncept WAS ND (1/2)

● dmgr proces – riadi nody● nodeagent proces – riadi aplikačné servery

Koncept WAS ND (2/2)

Vysoká dostupnosť aplikácií a služieb v JEE svete

HA terminológia

● High Availability● system design, zaručujúci dostupnosť aplikácií počas

plánovaného aj neplánovaného výpadku● Request Redirection – failover

● pokus o request na server a v prípade pádu servera presmerovanie tohto requestu na iný – dostupný

server

● Disaster Recovery● fyzická rekonštrukcia produkčnej prevádzky v záložnom

dátovom centri ● viacero stratégií (odkladanie na pásku, mirror na úrovni

storage,..)

Čo je to workload management (WLM)?

● Zdieľanie požiadaviek medzi viacerými servermi

● Výkon – zlepšenie odoziev aplikácií● Škálovanie – nárast kapacity● Load Balancing – proporčné rozdelenie

požiadaviek medzi zdroje – servery● Dostupnosť – aplikácie sú dostupné ak aj

padne server

WebSphere Application Server

Web request WLM

EJB request WLM

Session affinity (1/2)

● HTTP protokol je bez-stavový● Session objekt je server-side objekt● Čo sa stane so session pri páde servera?

Session affinity (2/2)

Failover (1/2)

Failover (2/2)

Failover ďalších komponentov

● Čo v prípade pádu load balancer-a?● LB active-standby – preklápa servisnú IP

● Čo v prípade pádu databázy?● V prípade pádu preklopí DB napr. IBM HACMP

● Čo v prípade zlyhania HW vrstvy?● Cluster je na niekoľkých fyzických serveroch

HA Gold Standard

JEE aplikácie a prevádzkové problémy v praxi

Odhaľovanie úzkeho hrdla v GC (1/4)

Odhaľovanie úzkeho hrdla v GC (2/4)

Odhaľovanie úzkeho hrdla v GC (3/4)

Odhaľovanie úzkeho hrdla v GC (4/4)

● Prenášanie WebService attachmentov ako base64 encoded string – alokácie až do 300 MB!

● Je potrebné streamovať● Spracovávať veľké objekty po kusoch – DOM

vs SAX● Prehodnotiť 64bit java vs 32bit java – pozor 32

bit Java je výkonnejšia

OutOfMemory

Leaking Container Object Type Leak Unit Object Type Number ofInstances

Heap Size of LeakContainer

sk.ditec.etax.ep.EPSingleton java.util.HashMap 3 517MBjava.util.HashMap sk.ditec.etax.ep.EPDocument 4103 517MBsk.ditec.etax.ep.EPDocument java.lang.String 34458 337MB

Hung process - problém3XMTHREADINFO "Servlet.Engine.Transports : 127" (TID:0x704E7A10, sys_thread_t:0x43E0EF28, state:R, native ID:0xE0EF) prio=5 4XESTACKTRACE at java.net.SocketOutputStream.socketWrite0(Native Method) 4XESTACKTRACE at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java(Compiled Code)) 4XESTACKTRACE at java.net.SocketOutputStream.write(SocketOutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.sslite.t.a(t.java(Compiled Code)) 4XESTACKTRACE at com.ibm.sslite.b.write(b.java(Compiled Code)) 4XESTACKTRACE at com.ibm.jsse.b.write(Unknown Source) 4XESTACKTRACE at com.ibm.rmi.util.buffer.SimpleByteBuffer.flushTo(SimpleByteBuffer.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.IIOPOutputStream.writeTo(IIOPOutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.Connection.sendFragment(Connection.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.IIOPOutputStream.sendFragment(IIOPOutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.CDROutputStream.grow(CDROutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.CDROutputStream.alignAndReserve(CDROutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.CDROutputStream.writeOctetArrayPiece(CDROutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.CDROutputStream.write_octet_array(CDROutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.CDROutputStream.write_octet_array(CDROutputStream.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.ClientRequestImpl.write_octet_array(ClientRequestImpl.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.ServiceContext.write(ServiceContext.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.RequestMessage.write(RequestMessage.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.ClientRequestImpl.<init>(ClientRequestImpl.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.GIOPImpl.createRequest(GIOPImpl.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.iiop.GIOPImpl.createRequest(GIOPImpl.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.corba.ClientDelegate._createRequest_WLM(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.rmi.corba.ClientDelegate.request(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at com.ibm.CORBA.iiop.ClientDelegate.request(ClientDelegate.java(Compiled Code)) 4XESTACKTRACE at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java(Compiled Code)) 4XESTACKTRACE at sk.novitech.etax.et.dt.docType._DocumentTypeHome_Stub.create(_DocumentTypeHome_Stub.java(Compiled Code)) 4XESTACKTRACE at sk.novitech.etax.et.dt.docType.DocumentTypeRemoteClient.getEjb(DocumentTypeRemoteClient.java(Compiled Code)) 4XESTACKTRACE at PodanieDPWAR.service(PodanieDPWAR.java(Compiled Code)) 4XESTACKTRACE at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) 4XESTACKTRACE at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code)) 4XESTACKTRACE at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code)) 4XESTACKTRACE at com.ibm.ws.webcontainer.servlet.ServicingServletState.service(StrictLifecycleServlet.java(Compiled Code))

Hung process – riešenie (1/2)public class LookupCache {

private static LookupCache instance;private static Logger logger = LoggerUtils.getLogger(LookupCache.class.getCanonicalName());private Context context;private Map<String, EJBHome> cache;private LookupCache() throws NamingException{

cache = new WeakHashMap<String, EJBHome>();context = new InitialContext();

}

public static LookupCache getInstance() throws NamingException{if(instance == null) {

instance = new LookupCache();}return instance;

}

public EJBHome lookupHome(String jndiRefName, String classToCast) throws NamingException, ClassCastException,ClassNotFoundException{

logger.entering(LookupCache.class.getCanonicalName(), "lookupHome");EJBHome home = null;if(logger.isLoggable(Level.FINEST)) {

logger.logp(Level.FINEST, LookupCache.class.getCanonicalName(), "lookupHome", "trying to lookup " + jndiRefName + " andnarrow it to " +classToCast);

}if(cache.containsKey(jndiRefName)) {

home = cache.get(jndiRefName);} else {

Object object = context.lookup(jndiRefName);home = (EJBHome) PortableRemoteObject.narrow(object, Class.forName(classToCast));cache.put(jndiRefName, home);

}logger.exiting(LookupCache.class.getCanonicalName(), "lookupHome",home);return home;

}}

Hung process – riešenie (2/2)

public class ServiceLocator {

public static DocumentType getDocumentType() {DocumentType documentType = null;DocumentTypeHome documentTypeHome = null;EJBHomeCache cache = EJBHomeCache.getInstance();try {

documentTypeHome = (DocumentTypeHome) cache.lookupHome(DOCUMENT_TYPE_JNDI_REF_NAME, DocumentTypeHome.class);documentType = documentTypeHome.create();

} catch (RemoteException e) {logger.log(Level.SEVERE, e.getMessage(), e);

} catch (NamingException e) {logger.log(Level.SEVERE, e.getMessage(), e);

} catch (CreateException e) {logger.log(Level.SEVERE, e.getMessage(), e);

}return documentType;

}

public class CacheRemoteServlet extends HttpServlet {

private DocumentType documentType;

public void init() throws ServletException {super.init();documentType = ServiceLocator.getDocumentType();

}//volanie v doGet alebo doPost

if (documentType != null) {String str = documentType.getDocumentTypeInfo();request.setAttribute(CacheHomeServlet.RETURN_VALUE_ATTR_NAME, str);

}//...

Logovanie – ako to nemá vyzerať2/16/10 13:09:03:298 CET] 6a2497ef SystemOut O 1. Nieje null dopytNaDanoveKalendare.[2/16/10 13:09:03:298 CET] 6a2497ef SystemOut O Ahoj urobil som dopytNaDanoveKalendare. [2/16/10 13:09:03:299 CET] 6a2497ef SystemOut O 2. Nieje null dopytNaDanoveKalendare. [2/16/10 13:09:03:387 CET] 6a2497ef SystemOut O nacitane bean.zobrazit 0[2/16/10 13:09:09:002 CET] 69ee97ef SystemOut O userId =null [2/16/10 13:09:09:003 CET] 69ee97ef SystemOut O ---adding--- SessionId:2108752105 [2/16/10 13:09:13:137 CET] 6a1897ef SystemOut O pripomienky nenacitavam... [2/16/10 13:09:13:144 CET] 6a2497ef SystemOut O pripomienky nenacitavam... [2/16/10 13:09:13:151 CET] c7e97ef SystemOut O pripomienky nenacitavam...

2/16/10 13:09:37:431 CET] 6a2497ef SystemOut O WPV5CURMRExample.V5WPSampleMemberRepositoryImpl.getUserByUniqueIdEJB() :ENDIPouzivatel=-----------------------------XUziv :1016074 XTitul :0 Meno :xxxxx Priezv : xxxxx Email :xxxxxxxx@xxx.skTel :00000000000Fax :00000000000XUzivAutor :1 DPoslPrihl :2010-02-16 13:09:00.0 Rc :460416760 Ulica :Nitrianska COrient :3Obec :Senec Psc :90301 XStat :703 CPasu : XJazyk :2 Heslo :null identKod :tono koOdp1 :31323 koOdp2 :null koOdp3 :null PrznCert :1000 BlokDoD :null XPrac :0

Logovanie - odporúčania (1/2)

● vyvarovať sa volaniam System.out.println, System.err.println v aplikačnom kóde

● na logovanie použiť framework java.util.logging

● oddeliť systémové logy od aplikačných – teda logovať do samostatných súborov v rovnakom adresári ako sú logy aplikačného servera.

● Logovať len naozaj nevyhnutné informácie potrebné pre prevádzku

● presunúť debug informácie a osobné údaje o subjektoch do hlbšej úrovne logovania ako je info

Logovanie - odporúčania (2/2)String loggerNames [] = {"name1", "name2", "name3" } ;Handler myHandler = null ;try {

myHandler = new FileHandler("/tmp/MyOutput") ;} catch (Exception e) {

System.out.println("Do something on IOException");}

for (int i = 0; i < loggerNames.length; i++) {// Consider rbundle tooLogger myLogger = Logger.getLogger(loggerNames[i]) ;

myLogger.setUseParentHandlers(false) ;myLogger.addHandler(myHandler) ;

}

// vytvorenie util triedy so statickou metódouLoggerUtils.getLogger(String loggerName)// volanie v triede

import java.util.logging.Logger;public class MyClass {

private static Logger logger = LoggerUtils.getLogger(MyClass.class.getCanonicalName());

//....body of class}

Session replication

● HTTP session objekty sa replikujú na jednotlivé JVM

● Session dáta sa musia serializovať a deserializovať

● Čím je objekt väčší, tým negatívnejšie ovplyvňuje výkon – záťaž na infraštruktúru aj na zaplnienie heap-u

Ďakujem za pozornosť

Recommended