212 BROUGHT TO YOU BY: join the tribe
» Installation » Configuration » Logging » Clustering Apache Tomcat » IDEs » I/O... and more! By Alex Soto Bueno and Romain Manni-Bucau CONTENTS
ABOUT APACHE TOMCAT Stops server waiting up to 5 seconds
stop [-force] Apache Tomcat is a pure Java open-source web server that -force option kills the process if not implements the Java Servlet, JavaServer Pages, and Expression stopped after 5 seconds Language specifications. Starts under JPDA debugger According to the JRebel report, Tomcat is one of the most used – Environment variable JPDA_ web servers in the Java world with more than 50% of the market ADDRESS defines the debug address jpda start share. (often just a port) and JPDA_ SUSPEND to suspend execution immediately after start-up INSTALLATION Get More Refcardz! Visit DZone.com/refcardz Get More Refcardz! When Tomcat is started in the foreground, it can be stopped by DOWNLOAD pressing Ctrl+C. The quickest way to run Tomcat is to download and run a compiled version. Go to http://tomcat.apache.org/ and in the There is a Windows package distribution that installs Tomcat Download section choose the Tomcat version that fits your as a Service on Windows operating systems. Most Linux requirements and package file depending on your OS. distributions have their own packaging. DIRECTORY LAYOUT TOMCAT VERSION SPECIFICATION DIRECTORY DESCRIPTION Servlet 3.1 / JSP 2.3 / EL 3.0 / Tomcat 8.0.x WebSocket 1.1 / Java 7 and later Stores executable files for /bin Windows/*nix systems to start and Servlet 3.0 / JSP 2.2 / EL 2.2 / stop server. Tomcat 7.0.x WebSocket 1.1 / Java 6 and later (WebSocket requires Java 7) /conf Stores configuration files. Servlet 2.5 / JSP 2.1 / EL 2.1 / Java 5 Stores libraries to share between all Tomcat 6.0.x and later /lib applications. By default, only Tomcat libraries are in this directory. To run Tomcat, you have to first install a Java Runtime Environment (JRE). Make sure to install the right version /logs Stores Tomcat log files. depending on the Tomcat version you want to run (see table Stores temporary files created using /temp above). the Java File API.
$ wget http://repo.maven.apache.org/maven2/org/apache/ Deploys .war files or exploded web /webapps tomcat/tomcat/8.0.24/tomcat-8.0.24.tar.gz applications. $ tar -zxvf apache-tomcat-8.0.24.tar.gz $ cd apache-tomcat-8.0.24 Stores intermediate files (such as /work compiled JSP files) during its work. The root directory is known as CATALINA_HOME. Optionally, Tomcat may be configured for multiple instances by defining CATALINA_BASE for each instance. For a single installation, CATALINA_BASE is the same as CATALINA_HOME.
RUNNING The main script to start Tomcat is ${CATALINA_HOME}/bin/ catalina.sh and the most used start-up commands are:
COMMAND DESCRIPTION debug [-security] Starts in a debugger Starts in a separate window (or in the start [-security] background) Starts in the current window (in the run [-security] foreground) JAVA ENTERPRISEJAVA EDITION 7 APACHE TOMCAT APACHE © DZONE, INC. | DZONE.COM 2 APACHE TOMCAT
CLASSLOADING CONFIGURATION bootstrap Apache Tomcat’s main configuration is composed of four files: $JAVA HOME jre lib ext ( _ / / / ) server.xml, context.xml, web.xml, and logging.properties.
SERVER.XML server.xml is located in ${CATALINA_BASE}/conf and represents system the server itself. Here is an example: (bin/boostrap.jar:bin/tomcat-juli.jar)
EMBEDDING
//adds a new context pointing to current directory as base socket definition) and hierarchy d ir. Tomcat internal events listener (see Context ctx = tomcat.addContext("/", new File("."). Listener getAbsolutePath()); org.apache.catalina.LifecycleListener) Defines a set of container-wide resources //registers a servlet with name hello GlobalNamingResources Tomcat.addServlet(ctx, "hello", new HttpServlet() { (as opposed to application ones) protected void service(HttpServletRequest req, HttpServletResponse resp) throws Exception { Resource Defines a JNDI resource Writer w = resp.getWriter(); w.write("Hello World"); Service A set of connectors and an engine w.flush(); } Defines a protocol to use and its }); Connector configuration (most common ones are HTTP and AJP) //adds a new mapping so any URL executes hello servlet c t x.a d d S er vle t M a p pin g("/*", "h ello"); The “processor” of an incoming //starts Tomcat instance request from a connector (a pipeline tomcat.start(); Engine starting from the host, going through //waits current thread indefinitely authentication if needed, the webapp tomcat.getServer().await(); and finally the servlet)
© DZONE, INC. | DZONE.COM 3 APACHE TOMCAT
NAME ROLE NAME ROLE The thread pool associated with a Which paths should be scanned/ Executor Service to handle the request JarScanFilter ignored, should tag libraries (TLDs) be scanned Security repository (login/password/ Realm roles), 0 or 1 can be linked to Host, Named values that will be made Engine, and/or Context Environment visible to the web application as environment entry resources Virtual host representation (“domain”).
Host It is a container of Contexts (explicit or WEB.XML implicit using appBase). This section does not refer to WEB-INF/web.xml, which is a Context A web application standard deployment descriptor of the Servlet specification, but An element of the request pipeline (can about ${CATALINA_BASE}/conf/web.xml. Valve be added on Engine, Host, or Context) This is a standard web.xml where mime types, default servlets/ filters, default welcome files, and default session timeouts are CONTEXT.XML defined. This configuration is inherited by all web applications. context.xml is a configuration file for a web application. You can Here are the default servlets and some examples of why you might also use a Context element under the Host tag in server.xml, but it need to update them: is recommended (if necessary) that you provide them either in the web application in META-INF/context.xml or (if the configuration is SERVLET GOAL local to the Tomcat instance) in ${CATALINA_BASE}/conf/
Resources Where resources (JS, CSS, HTML, …., The default configuration is in ${CATALINA_BASE}/conf/logging. (PreResources, JarResources, .class) are taken from properties. Each web application can embed its own configuration PostResources) by defining a logging.properties file under WEB-INF/classes ResourceLink Link to a global JNDI entry directory of the webapp. Valve Same as in server.xml CONFIGURATION OVERVIEW
If the defined resource changes, Context my.logger.name.level = FINEST # a java.util.logging.Level WatchedResource will be reloaded (undeploy/deploy) my.logger.name.handlers = myHandler1, myHandler2,... my.logger.name.useParentHandlers = true # false by default LifecycleListener for each wrapper WrapperLifecycle (servlet) PREFIXES You can prefix a logger name with a String starting with a digit WrapperListener ContainerListener for each wrapper and ending with a dot (for instance 1prefix.my.logger.name). This The application scanner is useful to simultaneously configure the same handler (a file, for JarScanner implementation (which classloader instance) with different settings. to scan and how to get JAR paths)
© DZONE, INC. | DZONE.COM 4 APACHE TOMCAT
DYNAMIC VALUES IDES You can use place holders like ${xxx}. They get replaced automatically at runtime with the value of the Java system property Apache Tomcat is supported by major IDE vendors. with the key xxx. ECLIPSE ROOT LOGGER To register Tomcat on Eclipse WTP (Web Tools Platform). Root logger is configured using an empty name: • Open Window -> Preferences -> Server -> Installed Runtimes
.handlers = …. • Click on Add and in New Server Runtime, select Apache -> HANDLER Apache Tomcat v8.0 Tomcat provides several additional handlers like org.apache.juli. • Click Next and fill in your Tomcat installation directory FileHandler, which supports log buffering; AsyncFileHandler, which is asynchronous; and some formatters like JdkLoggerFormatter, which INTELLIJ IDEA uses the log4j equivalent format %r %-15.15c{2} %-1.1p %m %n. To register Tomcat in IntelliJ IDEA Ultimate Edition (communtiy edition is not supported): SERVLETCONTEXT LOGGING ServletContext.log(...) output is configurable using property • Open File -> Settings -> (IDE Settings) Application Servers org.apache.catalina.core.ContainerBase.[${engine}].[${host}]. • Click on the + symbol and select Tomcat Server [${context}]. • In the dialog box fill Tomcat Home with your Tomcat REPLACE JUL installation directory You can use log4j for Tomcat itself. To do this, you need to add NETBEANS log4j.jar, tomcat-juli-adapters.jar, and log4j.properties in Apache Tomcat comes pre-bundled with the Java EE distribution of ${CATALINA_HOME}/lib and replace tomcat-juli.jar from the bin/ Netbeans. Registering your own installation of Tomcat can be done directory with tomcat-juli.jar from the extras modules (See Tomcat as well. download page). Don’t forget to remove the conf/logging.properties file so that JUL does not create empty files. • Open Windows -> Services • Right-Click on Servers -> Add Server CLUSTERING • In the dialog box choose Apache Tomcat Tomcat supports clustering (session distribution and deployments) out of the box. To activate it, add a Cluster tag in your Host or • Click Next then fill Server Location with your Tomcat Engine. installation directory
The cluster tag supports these configurations: I/O
TAG ROLE Following today’s needs, Tomcat proposes several I/O solutions. Cluster Defines the cluster class and configuration. CONNECTORS Session replication strategy (by default it As explained in the Configuration section, Tomcat handles I/O Manager uses DeltaManager to send delta to nodes, thanks to connectors. Most of them share a common configuration, synchronously or not). the full details of which are available at http://tomcat.apache.org/ How cluster nodes are connected together tomcat-8.0-doc/config/http.html. (backed by Apache Tribes). NIO/NIO2 Channel has sub tags like Membership The NIO and NIO2 connectors allow you to use Java NIO to handle Channel (discovery of nodes), Sender (send message on incoming requests. With the release of Tomcat 8, they are now the the cluster), Receiver (how cluster messages default connectors to handle HTTP requests. are received) and Interceptor (listen for/send Note that to use NIO2 you need to specify the class org.apache. cluster messages). coyote.http11.Http11Nio2Protocol on your Connector tag in the Creates and replicates files when needed class-name attribute. Keep in mind it is still a “beta” connector, but Valve within the cluster (end of request by default). it can bring your application some significant speed enhancements. Allows deploy/undeploy actions across the BIO Deployer entire cluster applications. The BIO connector allows you to use the old blocking I/O. It was the default connector to handle HTTP requests for prior Tomcat 8 ClusterListener Observes cluster messages. versions.
Here is the most basic example: The main difference between NIO and BIO is that with the BIO connector you generally need more threads to handle requests
For Tomcat 9+ versions, the BIO connector has been completely NOTE: Don’t forget your session attributes need to be Serializable. removed. This is also a requirement if you want the session to survive Tomcat cycles (a.k.a. HTTP session serialization).
© DZONE, INC. | DZONE.COM 5 APACHE TOMCAT
AJP JNDI AJP is a protocol like HTTP. Its main goal is to get higher Tomcat provides a JNDI InitialContext implementation instance for performances. It is a binary version of HTTP, and also a connected each web application. As mentioned in the Configuration section, protocol as opposed to HTTP. It can be used with httpd (a.k.a Apache JNDI resources can be registered in conf/server.xml, conf/web.xml, Web Server) and most of the time with mod_jk or mod_proxy_ajp or any context.xml file. But Tomcat also follows the Java EE standard httpd modules. If you are using SSL or have a lot of static resources, for /WEB-INF/web.xml file to reference/define resources. this is the fastest connector! In order to use a JNDI resource, specify the JNDI name defined in the COMETD web application’s deployment descriptor: CometD is the old way to handle asynchronous I/O (i.e. let the context.xml container call you when data are available). This only works with }
© DZONE, INC. | DZONE.COM 6 APACHE TOMCAT
SHIPPED LISTENERS TOMCAT MANAGER
LISTENER DESCRIPTION WEB APPLICATION Checks for the presence Tomcat also comes with a web application called Manager, which org.apache.catalina.core. of the APR/native library allows for deploying an application from the web console. To use AprLifecycleListener and loads the library if it is the Manager, you need to add a username and password to conf/ present. tomcat-users.xml with role manager-gui.
Initializes the Global JNDI
Performs a number of http://{host}:{port}/manager/text/{command}?{parameters} security checks when org.apache.catalina.security. Tomcat starts and prevents Some examples of deploying an application using URI commands: SecurityListener Tomcat from starting if http://{host}:{port}/manager/text/deploy?path=/foo they fail; not enabled by default. The above uploads the WAR file with path /foo to the remote server. Triggers the renewal The WAR is provided as the body of the HTTP PUT. of threads in Executor org.apache.catalina.core. pools when a Context is http://{host}:{port}/manager/text/deploy?path=/foo&war=file:/ path/to/foo.war ThreadLocalLeakPreventionListener being stopped to avoid ThreadLocal-related This deploys applications stored in the server directory path/to/ memory leaks. foo.war. Maps a request URI starting ARQUILLIAN with a tilde character Arquillian is an integration and functional testing platform that can ("~") and a username to org.apache.catalina.startup. be used for Java middleware testing. The main goal of Arquillian is to a directory in that user's UserConfig make tests that require a server to be as simple as writing unit tests. home directory on the server; not enabled by You can use Arquillian Tomcat adapters to write integration/functional default. tests. Fixes the ports used by Arquillian Tomcat 8 adapter release is coming soon. org.apache.catalina.mbeans. the JMX/RMI Server; not JmxRemoteLifecycleListener Maven coordinates can be found at: enabled by default. http://arquillian.org/modules/arquillian-tomcat-embedded-7- DEPLOYING container-adapter/ http://arquillian.org/modules/arquillian-tomcat-managed-7- After installing and configuring Tomcat, you will need to deploy web container-adapter/ applications. http://arquillian.org/modules/arquillian-tomcat-remote-7- DROP-IN WAR container-adapter/ Deploying an application to Tomcat can be as simple as dropping a WAR file inside the $CATALINA_BASE/webapps directory; this will http://arquillian.org/modules/arquillian-tomcat-embedded-8- deploy the application. container-adapter/
HOT DEPLOYMENT When using the embedded adapter, Tomcat embedded To deploy a new application, you must restart the server in order for dependencies are required as well. the application to function. To fix this problem, Tomcat provides a When using the remote adapter, the Tomcat instance has to expose hot deployment option, which deploys an application without the a remote JMX MbeanConnection. need to restart.
To enable hot deployment, the autoDeploy attribute from host tag in JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote. port=8089" server.xml must be set to true. See the configuration section for an JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote. example. ssl=false" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote. authenticate=false"
© DZONE, INC. | DZONE.COM 7 APACHE TOMCAT
MAVEN GOAL DESCRIPTION Maven is still one of the most used build tools and therefore Tomcat integration is available. deploy/ undeploy/ (Un)deploys a WAR redeploy This integration is mainly (in addition to deploying artifacts on Create a runnable JAR or WAR running central) a Maven plugin. Exec-war / Tomcat and your application (java -jar Today, there are two plugins, tomcat6-maven-plugin for Tomcat 6 standalone-war mytomcatapp.jar) and tomcat7-maven-plugin for Tomcat 7; tomcat8-maven-plugin Start Tomcat embedded with current project is coming soon. run deployed as dynamic project Their usage is more or less the same: Same as run, using a WAR instead of run-war
BROWSE OUR COLLECTION OF 250+ FREE RESOURCES, INCLUDING: RESEARCH GUIDES: Unbiased insight from leading tech experts
REFCARDZ: Library of 200+ reference cards covering the latest tech topics
COMMUNITIES: Share links, author articles, and engage with other tech experts JOIN NOW
DZONE, INC. 150 PRESTON EXECUTIVE DR. CARY, NC 27513 DZone communities deliver over 6 million pages each month to more than 3.3 million software 888.678.0399 developers, architects and decision makers. DZone offers something for everyone, including news, 919.678.0300 tutorials, cheat sheets, research guides, feature articles, source code and more. REFCARDZ FEEDBACK WELCOME "DZone is a developer's dream," says PC Magazine. [email protected]
Copyright © 2015 DZone, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any © DZONE,© INC. DZONE, INC.DZONE.COMSPONSORSHIP OPPORTUNITIES form or by means electronic, mechanical, photocopying, or otherwise, without prior written permission of the publisher. | [email protected] VERSION 1.0 $7.95