apache tomcat 7 - peter rossbach - slide show [jug 2011]

Post on 24-Apr-2015

189 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Apache Tomcat 7Servlet API 3.0(7.0.6 Release)

Peter Roßbachpr@objektpark.de

© 2011 Peter Roßbach (pr@objektpark.de)

• Peter Roßbach

• FreiberuflicherIT-Systemarchitekt, Berater, Trainer und Autor

• Entwickler im Apache Tomcat Projekt

• Mitglied der Apache Software Foundation

• Webexperte

• Autor der TomC@Kolumne im Java Magazin

• Autor• http://tomcat.objektpark.org/

• Buch Tomcat 4x und Java Server und Servlets

• E-Mail : pr@objektpark.de

• Fachautor und Speaker auf deutschen Java Konferenzen

Mein Rucksack

2

© 2011 Peter Roßbach (pr@objektpark.de)

Was gibt es Neues?

• Servlet API 3.0 Support ( JSR 315)

• JSP API 2.2 ( Expression Language 2.2) JSR 254

• Apache Tomcat 7.0.6 Release ist fertig

• offizielle Test (TCK) zu 100% erfolgreich

• Redesign und Refactoring abgeschlossen

• Integration JEE 6 Web Profile

• Geronimo 3 ,OpenEJB 3.1.2, MyFaces 2 (Dev)

• SIwpas-1.0.0-CR4

• JBOSS 6/7 und JBoss Web 3

• Eclipse 3.6 - WTP 2.2

• Tomcat 6 als Basis im neuen Amazon Beanstalk Service

3 © 2011 Peter Roßbach (pr@objektpark.de)

Projekt wächst

• Standard Taglib Projekt (JSTL) ist nun Teilprojekt des Apache Tomcat Projekts

• http://tomcat.apache.org/taglibs/

• JSTL 1.0, 1.1 und 1.2

• 24 Entwickler im Apache Tomcat Projekt!

• http://wiki.apache.org/tomcat/PoweredBy

• 94 Referenz Unternehmen

• 32 Hosting Provider

• ca. 10 Mio Downloads

4

© 2011 Peter Roßbach (pr@objektpark.de)

History

5

4.1

5.0.trunk

3.3

5.5.25

6.0.15

X

1997 1999 2000

tomcat.next

2001

jserv

tomcat ref

2002

3.3.trunk

2007

3.23.1

3.3.2

2004

4.0

2003

3.2.4

2005 2006

4.0.6

X

X

4.1.10 4.1.36

5.0

5.5.12

4.1.31

3.0

5.0.275.0.19

5.5 5.5.20

4.1.34

6.0.106.0

Tomcat Architektur

Catalina Architektur

5.5.27

2008

4.1.37

6.0.26

2009

6.0.18

7.0

2010

7.0.0

X

X

5.5.28

2011

Servlet Api 2.4 JSP 2.0

Servlet Api 0.x-2.1 JSP 0.4-1.0

Servlet Api 2.2 + JSP 1.0

Servlet Api 2.3 JSP 1.1-1.2

7.0.6

5.5.31

6.0.31

ServletAPI 2.5 JSP 2.1

ServletAPI 3.0 JSP 2.2

© 2011 Peter Roßbach (pr@objektpark.de)

Web Container API‘s

6

Servlet JSP Tomcat Java

3.0 2.2 7.0.x 1.6

2.5 2.1 6.0.x 1.5

2.4 2.0 5.0.x & 5.5.x 1.4

2.3 1.2 4.0.x & 4.1.x 1.3

2.2 1.1 3.2.x & 3.3.x 1.2

© 2011 Peter Roßbach (pr@objektpark.de)

Servlet API 3.0

• Programmierung mit Annotationen

• Modularität der Anwendung und des Containers verbessern

• Web-Fragement

• Ressourcen

• Asynchrone Kommunikation

• Server Push

• Entkoppelung vom Container Thread

• File Upload direkt im Container

• Session und Cookie Handling verbessert

7 © 2011 Peter Roßbach (pr@objektpark.de)

Apache Tomcat 7 Basis

• Neues Lifecycle API der Komponenten (JMX Update)

• Alle Connectoren haben den Async Support

• Effizient nur mit NIO oder APR Connectoren

• Alle Connectoren nutzen nun die Executor ThreadPools

• MemoryLeakDetection für Anwendungsredeployment

• Deployment von Anwendungsversionen

• Einige Packages oder Komponenten sind verschoben

• CRSR Prevention Filter (s. Manager Anwendung)

• Module für eigenen JDBC Pool und Bayeux Implementierung

• Embedded und Unit testen mit Tomcat

• org.apache.catalina.startup.TomcatBaseTest

• org.apache.catalina.startup.Tomcat

8

© 2011 Peter Roßbach (pr@objektpark.de)

Neuer Start Screen

9 © 2011 Peter Roßbach (pr@objektpark.de)

Servlet API 3.0

• Programmatischen und modulare Erweiterbarkeit

• Vereinfachung des Deployments

• Async Servlet Support

• Kleinere Erweiterungen ...

• File Upload

• Session Tracking

10

© 2011 Peter Roßbach (pr@objektpark.de)

Neue Möglichkeiten API 3.0

• Integration von Web-Frameworks ohne weitere Konfiguration in der Datei web.xml.

• Annotationen von Servlets/Filter/Listener ...

• API für Servlet/Filter/Listener am ServletContext

• Modularisierung der web.xml: „Ein Framework bzw. JAR kann ein Stück der gesamten web.xml Konfiguration enthalten.“

• META-INF/web.xml in jedem Jar (WEB-INF/lib/*.jar) möglich

• web-fragment Element definieren Servlets, Filters, Listeners und ...

11 © 2011 Peter Roßbach (pr@objektpark.de)

Annotations

@WebServlet(“/myServlet”)public class MySampleServlet extends HttpServlet {

public void doGet(HttpServletRequest req,HttpServletResponse res) {}

}

@WebFilter(”/myServlet/*“)public class MyFilter extends Filter{

public void doFilter(req,res) {}}

12

© 2011 Peter Roßbach (pr@objektpark.de)

ServletFilter

13

import javax.servlet.FilterChain;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.annotation.FilterMapping;import javax.servlet.http.annotation.WebFilter;

@WebFilter("/myservlet/*")public class SetCharacterEncodingFilter implements Filter{.... public void doFilter (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws java.io.IOException, javax.servlet.ServletException { // Conditionally select and set the character encoding to be used if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); }

chain.doFilter(request, response); }}

© 2011 Peter Roßbach (pr@objektpark.de)

weitere Beispiele

@WebServlet(name= "MyServlet", urlPatterns={"/foo", "/bar"})public class SampleUsingAnnotationAttributes extends HttpServlet{

public void doGet(HttpServletRequest req, HttpServletResponse res) {}

}

14

@WebServlet(value="/foo", initParams = {

@WebInitParam(name=“debug“,value=“true“) })public class SampleUsingAnnotationAttributes extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) {}

}

© 2011 Peter Roßbach (pr@objektpark.de)

Annotations web.xml

• @WebServlet(name,urlPatterns,value,load-on-startup,description,smallIcon,largeIcon,asyncSupported)

• @WebFilter(display-name,filter-name,description,smallIcon,largeIcon,urlPatterns,servlet-names, dispatcher-types,value, asyncSupported)

• dispatcher-types ERROR,FORWARD,INCLUDE,REQUEST,ASYNC

• @WebFilter(value = "/param", filterName = "paramFilter", dispatcherTypes = { DispatcherType.ERROR, DispatcherType.ASYNC },initParams = { @WebInitParam(name = "message", value = "Servlet says: ") })

• @WebInitParam(description,name,value)

• @WebListener(description)

15 © 2010 Peter Roßbach (pr@objektpark.de)

Eclipse Java Annotation Support

16

© 2011 Peter Roßbach (pr@objektpark.de)

Annotation Overwrite

• Deklaration in der web.xml überschreibt Konfiguration in der Annotation

• nur urlPatterns der web.xml gelten, sonst die der Annotation

• initParameter werden durch Deskriptor überschrieben oder durch Annotation ergänzt

• Ergänzung der Werte durch die Annotation, wenn nicht im Deskriptor explizit definiert.

17 © 2011 Peter Roßbach (pr@objektpark.de)

Disable Servlet

18

<servlet> <servlet-name>param</servlet-name> <servlet-class>annotation.ParamServlet</servlet-class> <init-param> <param-name>foo</param-name> <param-value>hello</param-value> </init-param> <init-param> <param-name>bar</param-name> <param-value>peter</param-value> </init-param>

<!-- Disable this servlet --> <enabled>false</enabled>

</servlet>

© 2011 Peter Roßbach (pr@objektpark.de)

WebSecurity Constraint

19

@WebServlet("/security")@ServletSecurity((httpMethodConstraints = { @HttpMethodConstraint(

value = "GET",rolesAllowed = {"user", "manager"}),

@HttpMethodConstraint( value = "POST", rolesAllowed = "manager", transportGuarantee = TransportGuarantee.CONFIDENTIAL) })

public class SecurityServlet extends HttpServlet { ...}

© 2011 Peter Roßbach (pr@objektpark.de)

Listener

@WebListener(description="init fine tricks") public class MyListener implements ServletContextListener {

public void contextInialized(ServletContextEvent event){...}public void contextDestroy(ServletContextEvent event) {...}

}

20

© 2011 Peter Roßbach (pr@objektpark.de)

ServletContext.addServlet

@WebListenerpublic class MyListener implements ServletContextListener{

public void contextInitialized (ServletContextEvent sce) {ServletContext servletContext = event.getServletContext();ServletRegistration reg = servletContext.addServlet("Hello", HelloApiServlet.class);reg.addMapping("/hello2");

Map<String,String> initParameters = new HashMap<String,String>();initParameters.put("foo", "bar");reg.setInitParameters(initParameters);

}...

}

21 © 2011 Peter Roßbach (pr@objektpark.de)

ServletContext.addFilter

@WebListenerpublic class MyListener implements ServletContextListener {

public void contextInitialized (ServletContextEvent sce) {ServletContext servletContext = event.getServletContext();

FilterRegistration freg = servletContext.addFilter("helloFilter", ParamFilter.class); freg.addMappingForUrlPatterns( EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), true, "/hello2", "/param");

}}

22

© 2011 Peter Roßbach (pr@objektpark.de)

ServletContext

23 © 2011 Peter Roßbach (pr@objektpark.de)

Annotations 3.0

• Voraussetzung in WEB-INF/web.xml

• <metadata-complete>false<metadata-complete>

• Es müssen alle Klassen in WEB-INF/classes und WEB-INF/lib/*.jar untersucht werden.

• Erweiterung im Tomcat

• JarScanner Konfiguration im Context

• <Context> <JarScanner className="org.apache.tomcat.util.scan.StandardJarScanner" scanClassPath= "true" /> </Context>

• Deny System Property

• -Dtomcat.util.scan.DefaultJarScanner.jarsToSkip="logging-api.jar,admin.jar"

24

© 2011 Peter Roßbach (pr@objektpark.de)

Servlet API 3.0: web-fragment

<web-fragment> <servlet> <servlet-name>welcome</servlet-name> <servlet-class> WelcomeServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/Welcome</url-pattern> </servlet-mapping>...</web-fragment>

25

• jar:/WEB-INF/lib/hello.jar!/META-INF/web-fragment.xml

© 2011 Peter Roßbach (pr@objektpark.de)

Ressoure Loading

• Anwendung modularisieren

• WEB-INF/lib/<fragments>.jar!META-INF/resources

• Servlets, Filter, Listener

• Konfigurationen: web-fragments.xml

• Ressourcen

26

© 2011 Peter Roßbach (pr@objektpark.de)

War

27

war

WEB-INFresourceA.jsp

lib web.xml

resources2.jarresources.jar

resourceE.jsp

folderresourceC.jsp

© 2011 Peter Roßbach (pr@objektpark.de)

resources.jar

28

resources.jar

META-INFanno.ServletA

resources web-fragment.xml

folder

resourceC.jsp

resourceA.jsp

resourceD.jsp

resourceB.jsp

© 2011 Peter Roßbach (pr@objektpark.de)

resource2.jar

29

resources2.jar

META-INFanno.ServletA

resources web-fragment.xml

folder

resourceC.jsp

resourceF.jsp

© 2011 Peter Roßbach (pr@objektpark.de)

ServletContainerInitializer

• Unterstützung des JDK 6 JAR Service API

• META-INF/services/javax.servlet.ServletContainerInitializer

• Name der Klassen ServletContainerInitializer für dieses Jar

• Bekommt alle Klassen aus allen „Jars“ die Klassen HandlesTypes implementieren.

• Berücksichtigung der WebFragment Ordering

• Beispiele: Mojarra(JSF RI) und Jersey (JAX-RS)

30

@HandlesTypes(AnnotationA.class)AServletContainerInitializer implements ServletContainerInitializer{ public void onStartup(Set<Class<A>> c, ServletContext ctx) throws ServletException { // framework setup Servlets/Filter/Listener ServletRegistration reg = ctx.addServlet("AServlet", "com.foo.AServlet"); reg.addServletMapping("/foo");...}

© 2011 Peter Roßbach (pr@objektpark.de)

Module ausserhalb der WebApp

<Context aliases="/content=${catalina.base}/content">

<JarScanner scanClassPath="true" />

<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${catalina.base}/admin/lib/hello2.jar" />

</Context>

31 © 2011 Peter Roßbach (pr@objektpark.de)

Plugins(aliases, JAR‘s)

32

<apps1>.war apps1/static

webapps contents

/static=contents/apps1/static

aliases

WEB-INF/lib/*.jar apps1/lib/*.jar

virtualClasspath="${catalina.base}/app1/lib/*.jar

VirtualWebappLoader

© 2011 Peter Roßbach (pr@objektpark.de)

Web-Plugins?

• Beim Undeploy der Anwendung bleiben die Plugins erhalten.

• Bei Context allowLinking= "true" werden die Inhalte der Links mit gelöscht, da sie vollwertige Bestandteile der Anwendung für den Tomcat sind.

• Integration von Ressourcen und Funktionserweiterung sind nun sehr elegant unterstützt.

33 © 2011 Peter Roßbach (pr@objektpark.de)

Ladereihenfolge

• Reihenfolge

1. Zuerst werden die Informationen der WEB-INF/web.xml geladen

• Tomcat lädt noch conf/web.xml!

2. Dann werden die web-fragmente.xml geladen

• absolute oder relative Ordering!

3. Dann werden die Annotations ausgewertet

• evtl. ServletContainerInitializer ausgewertet

• ServletContextListener Event Handling (1. oder 3.)

• addServlets and addFilters + Mappings

34

© 2011 Peter Roßbach (pr@objektpark.de)

Ordnung...

• Absolute Ordnung

• web.xml => <absolute-ordering>

• Relative Ordnung

• web-fragment.xml => <ordering>

35

<web-fragment> <name>MyWebFragment1</name> <ordering> <!-- Ingore as absolute ordering exists --> <before>MyWebFragment2</before> <after></others></after> </ordering></web-fragment>

<web-app> <name>MyApp</name> <absolute-ordering> <name>MyFragment3</name> <name>MyFragment2</name> </absolute-ordering> ... </web-app>

© 2011 Peter Roßbach (pr@objektpark.de)

Weitere Ressourcen laden...

36

<web-app> <name>MyApp</name> <absolute-ordering> <name>MyFragment3</name> <name>MyFragment2</name>

<others/> </absolute-ordering> ... </web-app>

© 2011 Peter Roßbach (pr@objektpark.de)

Konflikte

• Es wird im Prinzip ein grosser Merge durchgeführt.

• Ergebnis im ServletContext Attribute „org.apache.tomcat.util.scan.MergedWebXml“

• Bei Konflikten gewinnt der Eintrag in der web.xml.

• Konflikte zwischen Elemente verschiedener web-Fragments führen zu einem Fehler und die Anwendung ist nicht verfügbar!

• Es gibt additive Elemente wie <context-param> und <init-param>!

• Tomcat log: <Context logEffectiveWebXml="true" />

• Ausgabe der web.xml mit dem Merge-Resultat!

37 © 2011 Peter Roßbach (pr@objektpark.de)

metadata-complete

3.0 Notation: <web-app> <metadata-complete>false<metadata-complete>...

APImetadata-complete

Annotations bzw.

Fragments

2,5 true NEIN

2,5 false JA

3,0 true NEIN

3,0 false JA

2.5 Notation: <web-app metadata-complete=“false“>

38

© 2011 Peter Roßbach (pr@objektpark.de)

SessionTracking

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ HttpSession session = request.getSession(); Cart cart = (Cart)session.getValue(“cart”); // ... // do logic to get the inventory number and // quantity of goods that user wants to add to cart

cart.addItem(inventoryNumber, quanity);}

39 © 2011 Peter Roßbach (pr@objektpark.de)

Session Markierung

• Bisher:

• Cookie ( JSESSIONID)

• URL- Paramater ( jsessionid)

• ab 3.0 kann Namen der Parameter im Container geändert werden.

• ab Tomcat 6.0.20

• -Dorg.apache.catalina.SESSION_COOKIE_NAME=JSESSIONID

• -Dorg.apache.catalina.SESSION_PARAMETER_NAME=jsessionid

• ab mod_jk 1.2.28 ( worker.lb.session_cookie=JSESSIONID und worker.lb.session_path=;jsessionid

40

© 2011 Peter Roßbach (pr@objektpark.de)

SessionCookieConfig

• Voreinstellung der SessionCookie Information

• SessionCookieConfig(String!domain, String path, String!comment, boolean!isHttpOnly, boolean!isSecure)

41

@WebListenerpublic class MyListener implements ServletContextListener {

public void contextInitialized (ServletContextEvent sce) {ServletContext context = sce.getServletContext();SessionCookieConfig scc = new SessionCookieConfig(„my.domain“,context,“/jup“,true, false) ;context.setSessionCookieConfig(scc);

}

© 2011 Peter Roßbach (pr@objektpark.de)

SessionTrackingModes

• setSessionTrackingModes(java.util.EnumSet<SessionTrackingMode>!sessionTrackingModes)

• SessionTrackingMode.COOKIE (default)

• SessionTrackingMode.URL (default)

• SessionTrackingMode.SSL

42

@WebListenerpublic class MyListener implements ServletContextListener {

public void contextInitialized (ServletContextEvent sce) {ServletContext context = sce.getServletContext();context.setSessionTrackingMode(EnumSet.of(SessionTrackingMode.COOKIE, SessionTrackingMode.URL, SessionTrackingMode.SSL));

}

© 2011 Peter Roßbach (pr@objektpark.de)

Async Servlet

Die berücksichtigten Use Cases für Asynchronität sind-Server Side AJAX Push per Comet- Asynchrone Web Services und Web Proxies- Ermöglicht non-blocking Verhalten des Containers bei langen Requests

Erweiterung von ServletRequest um folgende MethodenaddAsyncListener(AsyncListener listener)addAsyncListener(AsyncListener listener, ServletRequest req, ServletResponse res)getAsyncContext()startAsync() oder startAsync(ServletRequest req, ServletResponse res)

43 © 2011 Peter Roßbach (pr@objektpark.de)

Asynchron IO

• Aktueller Stand entspricht einer Entkoppelung des Container Request Threads von der Bearbeitung von Request und Response

• Was ist der Asynch IO in der Servlet Spec nicht?

• Eine Non Blocking IO Implementierung

• Warum?

• Problem mit der Rückwärtskompatibilität

• Bewusst ein komplexes Programmiermodel vermieden

44

© 2011 Peter Roßbach (pr@objektpark.de)

AsyncSupport

45

@WebFilter(value=“/hello“, asyncSupported=true)public class myFilter implements Filter {}

@WebServlet(value=“/hello“,asyncSupported=true)public class myServlet extend HttpServlet {}

© 2011 Peter Roßbach (pr@objektpark.de)

AsyncSupport

46

interface javax.servlet.ServletRequest {

AsyncContext startAsync();

AsyncContext startAsync(Request,Response);

}

throws IllegalStateException wenn isAsyncSupported() returns false

© 2011 Peter Roßbach (pr@objektpark.de)

Async Beispiel

47

@WebServlet(value = "/simple", asyncSupported = true)public class SimpleDispatch extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { if (null == req.getAttribute("dispatch")) { resp.setContentType("text/plain"); AsyncContext actx = req.startAsync(); actx.setTimeout(Long.MAX_VALUE); Runnable run = new Runnable() { public void run() { try { req.setAttribute("dispatch", System .currentTimeMillis()); Thread.currentThread().setName("Simple-Thread"); Thread.sleep(2 * 1000); actx.dispatch(); } catch (Exception x) {} } }; actx.start(run);

//Thread t = new Thread(run); //t.start(); } else { resp.getWriter().write( "Simple request start at" + req.getAttribute("dispatch") + " and dispatch worked at" + System.currentTimeMillis() + "\n"); req.getAsyncContext().complete(); } }} © 2011 Peter Roßbach (pr@objektpark.de)

Besser....

48

service(Request req, Response res) { if (req.isAsyncSupported()) { AsyncContext actx = req.isAsyncStarted()? req.getAsyncContext(): req.startAsync(); ... } else { ... }}

© 2011 Peter Roßbach (pr@objektpark.de)

Listener von ServletRequest

• Registriere einen AsyncListener für Complete und Timeout

• void addAsyncListener(AsyncListener!listener)

• void addAsyncListener(AsyncListener!listener, ServletRequest!servletRequest, ServletResponse!servletResponse)

• Bestückung mit Wrapper

• asyncContext.setTimeout(long!timeout)

49

interface javax.servlet.AsyncListener {

void onComplete(AsyncEvent event)

void onTimeout(AsyncEvent event)...

}

© 2011 Peter Roßbach (pr@objektpark.de)

Timeout

• Wenn kein Timeout explizit gesetzt ist, gilt im Tomcat das Timeout des Connectors

• Default 10 sec

• Datei server.xml: <Connector asyncTimeout=“30000“ ...

• Besser immer ein programmatisches Timeout in der eigenen Anwendung setzen:

• asyncContext.setTimeout("15000");

50

© 2011 Peter Roßbach (pr@objektpark.de)

dispatch

51

interface javax.servlet.AsyncContext {

void dispatch();

void dispatch(String path); void dispatch(ServletContext ctx, String path)...}

Es wird ein Container Thread genutzt oder gestartet!Path muss mit ,/‘ starten und ist relative zum ServletContext

© 2011 Peter Roßbach (pr@objektpark.de)

Beispiel Forward

52

service(Request req, Response res) { final AsyncContext acontext = req.startAsync(); Runnable runnable = new Runnable() { public void run() { Message m = jmsListener.receive(); req.setAttribute(“quote”,m); //Neuer Container Thread wird gestartet acontext.dispatch(“/stock/quote.jsp”); } }; executor.submit(runnable); // Ende des bestehenden Container Threads // Kein Recycle oder Close des Request/Response!}

© 2011 Peter Roßbach (pr@objektpark.de)

Async Dispatch Attribute

• javax.servlet.async.request_uri

• javax.servlet. async.context_path

• javax.servlet. async.servlet_path

• javax.servlet. async.path_info

• javax.servlet. async.query_string

53 © 2011 Peter Roßbach (pr@objektpark.de)

AsyncContext

54

© 2011 Peter Roßbach (pr@objektpark.de)

File Upload

• Anfrage ist vom Type „multipart/form-data“

• Neue Methoden am HttpServletRequest

• public Iterable<Part> getParts()

• public Part getPart(String name)

• Annotation MultipartConfig erforderlich

55

@WebServlet(name="upload")@MultipartConfig(location="temp",fileSizeThreshold="8196",maxFileSize="10485760",maxRequestSize="10485760")

public class myUploadServlet extend HttpServlet {}

© 2011 Peter Roßbach (pr@objektpark.de)

Part

56

© 2011 Peter Roßbach (pr@objektpark.de)

Weiteres

• Memory Leak Detection

• Connectoren nutzen alle die Executor Threadpools

• Module

• JDBC 4 DataSource Pool

• Comet Bayeux Implementierung

• AccessLogging von allen Requests und Async

57 © 2011 Peter Roßbach (pr@objektpark.de)

MemoryLeaks

• http://wiki.apache.org/tomcat/MemoryLeakProtection

• Falsche Nutzung von Threads

• Falsche Nutzung von ThreadLocals

• Risiko Shared Libs (JDBC DriverRegistration, Log API)

• Löschen von statischen Referenzen um den Speicherverbrauch des Lochs zu verkleinern

• Server Listener: JreMemoryPreventionListener

• ab Tomcat 6.0.24

• Behandelt JDK API‘S die nicht innerhalb eines WebAppCLassLoader instanziert werden dürfen.

58

© 2011 Peter Roßbach (pr@objektpark.de)

Konfiguration

59

<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className= "org.apache.catalina.core.JreMemoryLeakPreventionListener"/>

<GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"

readonly="true"/> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> <Host name="localhost" appBase="webapps" /> </Engine> </Service></Server>

© 2011 Peter Roßbach (pr@objektpark.de)

Beispiele probieren...

• <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

• neue Attribute im Context

• clearReferencesStatic=true

• Löschen aller public static‘s

• clearReferencesStopThreads=true

• Löschen aller Threads die in der Anwendung gestartet sind.

• clearReferencesThreadLocals=true

• Lösche aller ThreadLocals Entries die vom ClassLoader noch referenziert sind.

• unloadDelay=2000

60

© 2011 Peter Roßbach (pr@objektpark.de)

Thread Leaks...

• Konfiguration in der server.xml, bzw context.xml<Server ...>

<Listener className=“org.apache.catalina.core. ThreadLocalLeakPreventionListener“/>

<Context renewThreadsWhenStoppingContext=“true“ ...>

• Nach dem Undeploy einer Anwendung werden alle aktiven Thread der beteiligten Executors erneuert, wenn Sie das nächste Mal in den Pool zurückkommen.

• Dies verhindert effektiv versteckte Memory-Problem mit ThreadLocals die beim Undeployment der Anwendung nicht bereinigt werden.

61 © 2011 Peter Roßbach (pr@objektpark.de)

webapp - Versionen

62

Context Path Context Version Context Name Base filename

/foo None /foo foo

/foo/bar None /foo/bar foo#bar

Empty String None Empty String ROOT

/foo 42 /foo##42 foo##42

/foo/bar 42 /foo/bar##42 foo#bar##42

Empty String 42 ##42 ROOT##42

© 2011 Peter Roßbach (pr@objektpark.de)

Versioniertes Deployment

63 © 2011 Peter Roßbach (pr@objektpark.de)

Fazit: Deployment

• SubContext ist auch im Tomcat 6.0.x vorhanden (app#moduleA).

• Mit Tomcat 7.0.6 kommt das versionierte Deployment hinzu.

• Session sind immer fest einer Version zugeordent.

• Neue Session werden in der neuste Version gestartet, wenn diese aktive ist.

• Versionierte oder Submodule sind eigenen vollständige Anwendungen.

• Kombinierbar mit alle Servlet API 3.0 Eigenschaften und den Besonderheiten eines Tomcat 7 Context.

64

© 2011 Peter Roßbach (pr@objektpark.de)

Combined Relam

65

<Realm className="org.apache.catalina.realm.CombinedRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/nutzer"

userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>

</Realm>

Mehrere Authenfikations-Quellen

© 2011 Peter Roßbach (pr@objektpark.de)

Realm

• Login Brute-Force Attack-Schutz

• 5 Versuche

• 5 Minute Sperre

• Speicherung von 1000 Vorfällen

• Ein Löschen vor Ablauf einer Stunde aus dem Attack Cache gibt in der ersten Stunden eine Warnung!

66

<!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm>

© 2010 Peter Roßbach (pr@objektpark.de)

Test eines Servlets

67

package hello;import java.io.IOException;

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

@WebServlet("/Hello")public class Hello extends HttpServlet {

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); response.getWriter().println("Hello World!"); } }

© 2010 Peter Roßbach (pr@objektpark.de)

Tomcat HelloTest

68

package hello;

import java.io.File;import org.apache.catalina.core.StandardContext;import org.apache.catalina.startup.Tomcat;import org.apache.catalina.startup.TomcatBaseTest;import org.apache.tomcat.util.buf.ByteChunk;import org.junit.Test;

public class HelloTest extends TomcatBaseTest { @Test public void testHello() throws Exception { Tomcat tomcat = getTomcatInstance(); File appDir = new File("WebContent"); StandardContext ctx = (StandardContext) tomcat.addWebapp(null, "/hello", appDir.getAbsolutePath()); tomcat.addServlet(ctx, "hello", new Hello()); ctx.addServletMapping("/Hello", "hello"); tomcat.start();

ByteChunk out = getUrl("http://127.0.0.1:" + getPort() + "/hello/Hello"); assertEquals("Hello World!\n", out.toString()); }}

© 2010 Peter Roßbach (pr@objektpark.de)

Eclipse Ausgabe

69 © 2011 Peter Roßbach (pr@objektpark.de)

Status

• Tomcat 7.0.6 - Starter Release

• TCK passed

• Kleiner Bugs

• Nun brauchen wir Euch!!

• Integration in JEE 6 Web Profile in Geronimo

• Vermutlich Q1 2011

70

© 2011 Peter Roßbach (pr@objektpark.de)

F&Q

• Peter Roßbach

• News

! http://tomcat.objektpark.org/

• Kommen Sie zum meinen Workshop‘s und Sessions

! JAX Mainz 2011

! Beratung, Schulung, Workshops und Tomcat Support

• mailto:pr@objektpark.de

71 © 2011 Peter Roßbach (pr@objektpark.de)

Hilfe ist nah...

• LinuxHotel.de -- Lernen in angenehmer Atmosphäre mit Experten

• Schulungen für Administratoren und Entwickler

• Alles im Bereich Linux, Netzwerk und OS Services

• Groovy & Grails ( Dierk König & Marc Guillemot)

• Osgi (Gerd Wütherich )

• Apache Tomcat (Peter Roßbach)

• Apache httpd (Michael Wandel & Peter Roßbach)

• Webcontainer Firewalls (Christian Schneider & Thomas Krautgartner)

• Java für Architekten (Torsten Friebe)

• bald mehr...

72

top related