Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release)

Transcription

Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release)
Mein Rucksack
Apache Tomcat 7
Servlet API 3.0
(7.0.6 Release)
•
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
© 2011 Peter Roßbach ([email protected])
Was gibt es Neues?
•
•
•
JSP API 2.2 ( Expression Language 2.2) JSR 254
•
Apache Tomcat 7.0.6 Release ist fertig
Standard Taglib Projekt (JSTL) ist nun Teilprojekt des Apache Tomcat
Projekts
•
•
offizielle Test (TCK) zu 100% erfolgreich
Redesign und Refactoring abgeschlossen
•
•
Integration JEE 6 Web Profile
•
•
•
•
•
Projekt wächst
Servlet API 3.0 Support ( JSR 315)
•
•
•
2
Geronimo 3 ,OpenEJB 3.1.2, MyFaces 2 (Dev)
JBOSS 6/7 und JBoss Web 3
•
Eclipse 3.6 - WTP 2.2
JSTL 1.0, 1.1 und 1.2
24 Entwickler im Apache Tomcat Projekt!
http://wiki.apache.org/tomcat/PoweredBy
•
•
SIwpas-1.0.0-CR4
http://tomcat.apache.org/taglibs/
94 Referenz Unternehmen
32 Hosting Provider
ca. 10 Mio Downloads
Tomcat 6 als Basis im neuen Amazon Beanstalk Service
© 2011 Peter Roßbach ([email protected])
3
© 2011 Peter Roßbach ([email protected])
4
History
1997
1999
2000
2001
2002
2003
2004
2005
Web Container API‘s
2006
2007
2008
2009
Tomcat Architektur
2010
2011
Servlet Api 0.x-2.1 JSP 0.4-1.0
tomcat ref
Servlet Api 2.2 + JSP 1.0
3.0
3.1
3.2
3.2.4
X
jserv
3.3
3.3.2
3.3.trunk
X
Catalina Architektur
tomcat.next
4.0
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
Servlet Api 2.3 JSP 1.1-1.2
4.0.6
X
4.1
4.1.10
4.1.31
5.0
5.0.19
5.0.27
5.5
5.5.12
4.1.34
4.1.36
4.1.37
X
Servlet Api 2.4 JSP 2.0
5.0.trunk
5.5.20
5.5.25
X
5.5.27
5.5.28
5.5.31
ServletAPI 2.5 JSP 2.1
6.0
6.0.10
6.0.15
6.0.18
6.0.26
6.0.31
ServletAPI 3.0 JSP 2.2
7.0
7.0.0
© 2011 Peter Roßbach ([email protected])
5
7.0.6
© 2011 Peter Roßbach ([email protected])
Servlet API 3.0
•
•
•
•
•
•
•
•
•
•
•
•
Web-Fragement
Ressourcen
Asynchrone Kommunikation
Server Push
Entkoppelung vom Container Thread
File Upload direkt im Container
Alle Connectoren haben den Async Support
7
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
•
•
Session und Cookie Handling verbessert
© 2011 Peter Roßbach ([email protected])
Neues Lifecycle API der Komponenten (JMX Update)
•
Modularität der Anwendung und des Containers verbessern
•
•
•
•
Apache Tomcat 7 Basis
Programmierung mit Annotationen
•
•
6
org.apache.catalina.startup.TomcatBaseTest
org.apache.catalina.startup.Tomcat
© 2011 Peter Roßbach ([email protected])
8
Neuer Start Screen
Servlet API 3.0
•
•
•
•
© 2011 Peter Roßbach ([email protected])
9
Neue Möglichkeiten API 3.0
•
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 ...
© 2011 Peter Roßbach ([email protected])
Async Servlet Support
Kleinere Erweiterungen ...
•
•
File Upload
Session Tracking
© 2011 Peter Roßbach ([email protected])
10
@WebFilter(”/myServlet/*“)
public class MyFilter extends Filter{
public void doFilter(req,res) {}
}
Annotationen von Servlets/Filter/Listener ...
•
Vereinfachung des Deployments
Annotations
Integration von Web-Frameworks ohne weitere
Konfiguration in der Datei web.xml.
•
•
•
Programmatischen und modulare Erweiterbarkeit
@WebServlet(“/myServlet”)
public class MySampleServlet extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res) {}
}
11
© 2011 Peter Roßbach ([email protected])
12
ServletFilter
import
import
import
import
import
weitere Beispiele
javax.servlet.FilterChain;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.annotation.FilterMapping;
javax.servlet.http.annotation.WebFilter;
@WebServlet(name= "MyServlet", urlPatterns={"/foo", "/bar"})
public class SampleUsingAnnotationAttributes extends HttpServlet{
@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);
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
@WebServlet(value="/foo",
initParams = {
@WebInitParam(name=“debug“,value=“true“)
}
)
public class SampleUsingAnnotationAttributes extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
chain.doFilter(request, response);
}
}
© 2011 Peter Roßbach ([email protected])
13
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)
•
•
•
•
© 2011 Peter Roßbach ([email protected])
14
Eclipse Java Annotation Support
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)
© 2011 Peter Roßbach ([email protected])
15
© 2010 Peter Roßbach ([email protected])
16
Annotation Overwrite
•
Disable Servlet
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
•
<!-- Disable this servlet -->
<enabled>false</enabled>
Ergänzung der Werte durch die Annotation, wenn
nicht im Deskriptor explizit definiert.
© 2011 Peter Roßbach ([email protected])
<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>
</servlet>
17
18
© 2011 Peter Roßbach ([email protected])
WebSecurity Constraint
Listener
@WebServlet("/security")
@ServletSecurity((httpMethodConstraints = {
@HttpMethodConstraint(
value = "GET",
rolesAllowed = {"user", "manager"}),
@HttpMethodConstraint(
value = "POST",
rolesAllowed = "manager",
transportGuarantee = TransportGuarantee.CONFIDENTIAL)
})
@WebListener(description="init fine tricks")
public class MyListener implements ServletContextListener {
public void contextInialized(ServletContextEvent event)
{
...
}
public void contextDestroy(ServletContextEvent event)
{
...
}
}
public class SecurityServlet extends HttpServlet {
...
}
© 2011 Peter Roßbach ([email protected])
19
© 2011 Peter Roßbach ([email protected])
20
ServletContext.addServlet
ServletContext.addFilter
@WebListener
public class MyListener implements ServletContextListener{
public void contextInitialized (ServletContextEvent sce) {
ServletContext servletContext = event.getServletContext();
ServletRegistration reg =
servletContext.addServlet("Hello",
HelloApiServlet.class);
reg.addMapping("/hello2");
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized (ServletContextEvent sce) {
ServletContext servletContext =
event.getServletContext();
FilterRegistration freg =
servletContext.addFilter("helloFilter",
ParamFilter.class);
Map<String,String> initParameters = new
HashMap<String,String>();
initParameters.put("foo", "bar");
reg.setInitParameters(initParameters);
freg.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.REQUEST,
DispatcherType.ASYNC), true, "/hello2", "/param");
}
...
}
}
}
© 2011 Peter Roßbach ([email protected])
21
© 2011 Peter Roßbach ([email protected])
ServletContext
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
•
•
23
<Context> <JarScanner
className="org.apache.tomcat.util.scan.StandardJarScanne
r" scanClassPath= "true" /> </Context>
Deny System Property
•
© 2011 Peter Roßbach ([email protected])
22
-Dtomcat.util.scan.DefaultJarScanner.jarsToSkip=
"logging-api.jar,admin.jar"
© 2011 Peter Roßbach ([email protected])
24
Servlet API 3.0: web-fragment
•
Ressoure Loading
jar:/WEB-INF/lib/hello.jar!/META-INF/web-fragment.xml
<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>
•
Anwendung modularisieren
•
WEB-INF/lib/<fragments>.jar!META-INF/
resources
•
•
•
25
© 2011 Peter Roßbach ([email protected])
Servlets, Filter, Listener
Konfigurationen: web-fragments.xml
Ressourcen
26
© 2011 Peter Roßbach ([email protected])
War
resources.jar
resources.jar
war
anno.ServletA
resourceA.jsp
resourceC.jsp
folder
META-INF
WEB-INF
resources
resourceE.jsp
lib
resourceA.jsp
resources.jar
web-fragment.xml
web.xml
folder
resourceB.jsp
resources2.jar
resourceD.jsp
© 2011 Peter Roßbach ([email protected])
27
© 2011 Peter Roßbach ([email protected])
resourceC.jsp
28
resource2.jar
ServletContainerInitializer
•
resources2.jar
anno.ServletA
Unterstützung des JDK 6 JAR Service API
•
META-INF/services/javax.servlet.ServletContainerInitializer
•
•
META-INF
Name der Klassen ServletContainerInitializer für dieses Jar
Bekommt alle Klassen aus allen „Jars“ die Klassen HandlesTypes
implementieren.
•
resources
resourceF.jsp
web-fragment.xml
•
Beispiele: Mojarra(JSF RI) und Jersey (JAX-RS)
@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");
...
}
folder
resourceC.jsp
© 2011 Peter Roßbach ([email protected])
Berücksichtigung der WebFragment Ordering
29
Module ausserhalb der WebApp
30
© 2011 Peter Roßbach ([email protected])
Plugins(aliases, JAR‘s)
<Context
aliases="/content=${catalina.base}/content">
webapps
contents
<apps1>.war
apps1/static
aliases
<JarScanner scanClassPath="true" />
/static=contents/apps1/static
<Loader
className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="${catalina.base}/admin/lib/hello2.jar" />
</Context>
WEB-INF/lib/*.jar
apps1/lib/*.jar
VirtualWebappLoader
virtualClasspath="${catalina.base}/app1/lib/*.jar
© 2011 Peter Roßbach ([email protected])
31
© 2011 Peter Roßbach ([email protected])
32
Web-Plugins?
Ladereihenfolge
•
Reihenfolge
1. Zuerst werden die Informationen der WEB-INF/
web.xml geladen
•
•
•
•
Beim Undeploy der Anwendung bleiben die Plugins erhalten.
2. Dann werden die web-fragmente.xml geladen
Bei Context allowLinking= "true" werden die Inhalte der
Links mit gelöscht, da sie vollwertige Bestandteile der
Anwendung für den Tomcat sind.
•
•
•
evtl. ServletContainerInitializer ausgewertet
ServletContextListener Event Handling (1. oder 3.)
•
33
Ordnung...
•
Absolute Ordnung
•
•
web.xml => <absolute-ordering>
Relative Ordnung
•
web-fragment.xml => <ordering>
absolute oder relative Ordering!
3. Dann werden die Annotations ausgewertet
Integration von Ressourcen und Funktionserweiterung sind nun
sehr elegant unterstützt.
© 2011 Peter Roßbach ([email protected])
Tomcat lädt noch conf/web.xml!
addServlets and addFilters + Mappings
© 2011 Peter Roßbach ([email protected])
34
Weitere Ressourcen laden...
<web-app>
<name>MyApp</name>
<absolute-ordering>
<name>MyFragment3</name>
<name>MyFragment2</name>
</absolute-ordering>
...
</web-app>
<web-app>
<name>MyApp</name>
<absolute-ordering>
<name>MyFragment3</name>
<name>MyFragment2</name>
<others/>
</absolute-ordering>
...
</web-app>
<web-fragment>
<name>MyWebFragment1</name>
<ordering> <!-- Ingore as absolute ordering exists -->
<before>MyWebFragment2</before>
<after></others></after>
</ordering>
</web-fragment>
© 2011 Peter Roßbach ([email protected])
35
© 2011 Peter Roßbach ([email protected])
36
Konflikte
•
•
•
metadata-complete
API
metadatacomplete
Annotations
bzw.
Fragments
2,5
true
NEIN
Bei Konflikten gewinnt der Eintrag in der web.xml.
2,5
false
JA
Konflikte zwischen Elemente verschiedener webFragments führen zu einem Fehler und die
Anwendung ist nicht verfügbar!
3,0
true
NEIN
3,0
false
JA
Es wird im Prinzip ein grosser Merge durchgeführt.
•
Ergebnis im ServletContext Attribute
„org.apache.tomcat.util.scan.MergedWebXml“
•
Es gibt additive Elemente wie <context-param> und
<init-param>!
3.0 Notation: <web-app> <metadata-complete>false<metadatacomplete>...
•
Tomcat log: <Context logEffectiveWebXml="true" />
2.5 Notation: <web-app metadata-complete=“false“>
•
Ausgabe der web.xml mit dem Merge-Resultat!
© 2011 Peter Roßbach ([email protected])
37
© 2011 Peter Roßbach ([email protected])
SessionTracking
Session Markierung
•
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);
}
•
© 2011 Peter Roßbach ([email protected])
38
39
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
© 2011 Peter Roßbach ([email protected])
40
SessionCookieConfig
•
•
SessionTrackingModes
Voreinstellung der SessionCookie Information
•
SessionCookieConfig(
String!domain,
String path,
String!comment,
boolean!isHttpOnly,
boolean!isSecure)
@WebListener
public 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);
setSessionTrackingModes
(java.util.EnumSet<SessionTrackingMode>!sessionTrackingModes)
•
•
•
SessionTrackingMode.COOKIE (default)
SessionTrackingMode.URL (default)
SessionTrackingMode.SSL
@WebListener
public 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])
41
© 2011 Peter Roßbach ([email protected])
Async Servlet
Asynchron IO
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
•
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?
Erweiterung von ServletRequest um folgende Methoden
addAsyncListener(AsyncListener listener)
addAsyncListener(AsyncListener listener,
ServletRequest req, ServletResponse res)
getAsyncContext()
startAsync() oder startAsync(ServletRequest req, ServletResponse res)
© 2011 Peter Roßbach ([email protected])
42
43
•
•
Eine Non Blocking IO Implementierung
Warum?
•
•
Problem mit der Rückwärtskompatibilität
Bewusst ein komplexes Programmiermodel vermieden
© 2011 Peter Roßbach ([email protected])
44
AsyncSupport
AsyncSupport
@WebFilter(value=“/hello“, asyncSupported=true)
public class myFilter implements Filter {}
interface javax.servlet.ServletRequest {
AsyncContext startAsync();
AsyncContext startAsync(Request,Response);
}
@WebServlet(value=“/hello“,asyncSupported=true)
public class myServlet extend HttpServlet {}
45
© 2011 Peter Roßbach ([email protected])
throws IllegalStateException wenn
isAsyncSupported() returns false
Besser....
Async Beispiel
@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();
}
}
} Peter Roßbach ([email protected])
© 2011
46
© 2011 Peter Roßbach ([email protected])
service(Request req, Response res) {
if (req.isAsyncSupported()) {
AsyncContext actx =
req.isAsyncStarted()?
req.getAsyncContext():
req.startAsync();
...
} else {
...
}
}
47
© 2011 Peter Roßbach ([email protected])
48
Listener von ServletRequest
•
Timeout
Registriere einen AsyncListener für Complete und Timeout
•
•
void addAsyncListener(AsyncListener!listener)
void addAsyncListener(AsyncListener!listener,
ServletRequest!servletRequest, ServletResponse!servletResponse)
•
•
•
Bestückung mit Wrapper
Wenn kein Timeout explizit gesetzt ist, gilt im Tomcat das Timeout des
Connectors
•
•
asyncContext.setTimeout(long!timeout)
interface javax.servlet.AsyncListener {
•
void onComplete(AsyncEvent event)
Datei server.xml: <Connector asyncTimeout=“30000“ ...
Besser immer ein programmatisches Timeout in der eigenen Anwendung
setzen:
•
void onTimeout(AsyncEvent event)
...
Default 10 sec
asyncContext.setTimeout("15000");
}
49
© 2011 Peter Roßbach ([email protected])
dispatch
50
Beispiel Forward
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!
}
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])
© 2011 Peter Roßbach ([email protected])
51
© 2011 Peter Roßbach ([email protected])
52
Async Dispatch Attribute
•
•
•
•
•
AsyncContext
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])
File Upload
•
•
•
54
© 2011 Peter Roßbach ([email protected])
Part
Anfrage ist vom Type „multipart/form-data“
Neue Methoden am HttpServletRequest
public Iterable<Part> getParts()
public Part getPart(String name)
Annotation MultipartConfig erforderlich
•
•
@WebServlet(name="upload")
@MultipartConfig(location="temp",
fileSizeThreshold="8196",
maxFileSize="10485760",
maxRequestSize="10485760")
public class myUploadServlet extend HttpServlet {}
© 2011 Peter Roßbach ([email protected])
55
© 2011 Peter Roßbach ([email protected])
56
Weiteres
MemoryLeaks
•
•
•
•
•
•
•
•
•
Memory Leak Detection
Connectoren nutzen alle die Executor Threadpools
Module
•
•
JDBC 4 DataSource Pool
•
Comet Bayeux Implementierung
57
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
•
•
AccessLogging von allen Requests und Async
© 2011 Peter Roßbach ([email protected])
http://wiki.apache.org/tomcat/MemoryLeakProtection
ab Tomcat 6.0.24
Behandelt JDK API‘S die nicht innerhalb eines WebAppCLassLoader
instanziert werden dürfen.
© 2011 Peter Roßbach ([email protected])
Konfiguration
Beispiele probieren...
<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])
58
59
•
<Listener
className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
•
neue Attribute im Context
•
clearReferencesStatic=true
•
•
clearReferencesStopThreads=true
•
•
Löschen aller Threads die in der Anwendung gestartet sind.
clearReferencesThreadLocals=true
•
•
Löschen aller public static‘s
Lösche aller ThreadLocals Entries die vom ClassLoader noch
referenziert sind.
unloadDelay=2000
© 2011 Peter Roßbach ([email protected])
60
Thread Leaks...
•
webapp - Versionen
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.
© 2011 Peter Roßbach ([email protected])
61
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
Fazit: Deployment
•
•
SubContext ist auch im Tomcat 6.0.x vorhanden (app#moduleA).
Mit Tomcat 7.0.6 kommt das versionierte Deployment hinzu.
•
•
•
•
© 2011 Peter Roßbach ([email protected])
62
63
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.
© 2011 Peter Roßbach ([email protected])
64
Combined Relam
Realm
•
Mehrere Authenfikations-Quellen
•
•
•
•
<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"/>
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!
<!-- 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>
</Realm>
© 2011 Peter Roßbach ([email protected])
Login Brute-Force Attack-Schutz
65
© 2011 Peter Roßbach ([email protected])
Test eines Servlets
66
Tomcat HelloTest
package hello;
import java.io.IOException;
package hello;
import
import
import
import
import
import
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
java.io.File;
org.apache.catalina.core.StandardContext;
org.apache.catalina.startup.Tomcat;
org.apache.catalina.startup.TomcatBaseTest;
org.apache.tomcat.util.buf.ByteChunk;
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();
@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!");
}
ByteChunk out = getUrl("http://127.0.0.1:" + getPort() + "/hello/Hello");
assertEquals("Hello World!\n", out.toString());
}
}
}
© 2010 Peter Roßbach ([email protected])
67
© 2010 Peter Roßbach ([email protected])
68
Eclipse Ausgabe
Status
•
•
69
© 2010 Peter Roßbach ([email protected])
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
© 2011 Peter Roßbach ([email protected])
F&Q
Hilfe ist nah...
•
•
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]
•
© 2011 Peter Roßbach ([email protected])
LinuxHotel.de -- Lernen in angenehmer Atmosphäre mit Experten
•
•
•
•
•
•
•
•
•
Peter Roßbach
•
70
71
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...
© 2011 Peter Roßbach ([email protected])
72