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

18
Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release) Peter Roßbach [email protected] © 2011 Peter Roßbach ([email protected] ) Peter Roßbach Freiberuflicher IT-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 : [email protected] Fachautor und Speaker auf deutschen Java Konferenzen Mein Rucksack 2 © 2011 Peter Roßbach ([email protected] ) 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 ([email protected] ) 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

Upload: daniel8

Post on 24-Apr-2015

189 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

Apache Tomcat 7Servlet API 3.0(7.0.6 Release)

Peter Roß[email protected]

© 2011 Peter Roßbach ([email protected])

• 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 : [email protected]

• Fachautor und Speaker auf deutschen Java Konferenzen

Mein Rucksack

2

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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

Page 2: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 3: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

Neuer Start Screen

9 © 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 4: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

Eclipse Java Annotation Support

16

Page 5: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

Listener

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

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

}

20

Page 6: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

ServletContext

23 © 2011 Peter Roßbach ([email protected])

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

Page 7: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

War

27

war

WEB-INFresourceA.jsp

lib web.xml

resources2.jarresources.jar

resourceE.jsp

folderresourceC.jsp

© 2011 Peter Roßbach ([email protected])

resources.jar

28

resources.jar

META-INFanno.ServletA

resources web-fragment.xml

folder

resourceC.jsp

resourceA.jsp

resourceD.jsp

resourceB.jsp

Page 8: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

resource2.jar

29

resources2.jar

META-INFanno.ServletA

resources web-fragment.xml

folder

resourceC.jsp

resourceF.jsp

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 9: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

Weitere Ressourcen laden...

36

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

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

Page 10: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 11: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 12: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

AsyncSupport

46

interface javax.servlet.ServletRequest {

AsyncContext startAsync();

AsyncContext startAsync(Request,Response);

}

throws IllegalStateException wenn isAsyncSupported() returns false

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

Besser....

48

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

Page 13: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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!}

Page 14: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

AsyncContext

54

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

Part

56

Page 15: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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

Page 16: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

Versioniertes Deployment

63 © 2011 Peter Roßbach ([email protected])

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

Page 17: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2011 Peter Roßbach ([email protected])

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 ([email protected])

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 ([email protected])

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 ([email protected])

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()); }}

Page 18: Apache Tomcat 7 - Peter Rossbach - Slide Show [Jug 2011]

© 2010 Peter Roßbach ([email protected])

Eclipse Ausgabe

69 © 2011 Peter Roßbach ([email protected])

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 ([email protected])

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:[email protected]

71 © 2011 Peter Roßbach ([email protected])

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