Java a JEE - stuba.skpolasek/courses/ass-sk/files/JEEGirovsky.pdfJava™ Platform, Enterprise...
Transcript of Java a JEE - stuba.skpolasek/courses/ass-sk/files/JEEGirovsky.pdfJava™ Platform, Enterprise...
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 :[email protected] :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ť