blob: e4e6283dbf69a351e09c2230e430b557ecc6e39d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>StatelessContainer Configuration</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>A StatelessContainer can be declared via xml in the
<code>&lt;tomee-home&gt;/conf/tomee.xml</code> file or in a <code>WEB-INF/resources.xml</code> file
using a declaration like the following. All properties in the element
body are optional.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;Container id="myStatelessContainer" type="STATELESS"&gt;
accessTimeout = 30 seconds
callbackThreads = 5
closeTimeout = 5 minutes
garbageCollection = false
idleTimeout = 0 minutes
maxAge = 0 hours
maxAgeOffset = -1
maxSize = 10
minSize = 0
replaceAged = true
replaceFlushed = false
strictPooling = true
sweepInterval = 5 minutes
&lt;/Container&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively, a StatelessContainer can be declared via properties in
the <code>&lt;tomee-home&gt;/conf/system.properties</code> file or via Java
VirtualMachine <code>-D</code> properties. The properties can also be used when
embedding TomEE via the <code>javax.ejb.embeddable.EJBContainer</code> API or
<code>InitialContext</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">myStatelessContainer = new://Container?type=STATELESS
myStatelessContainer.accessTimeout = 30 seconds
myStatelessContainer.callbackThreads = 5
myStatelessContainer.closeTimeout = 5 minutes
myStatelessContainer.garbageCollection = false
myStatelessContainer.idleTimeout = 0 minutes
myStatelessContainer.maxAge = 0 hours
myStatelessContainer.maxAgeOffset = -1
myStatelessContainer.maxSize = 10
myStatelessContainer.minSize = 0
myStatelessContainer.replaceAged = true
myStatelessContainer.replaceFlushed = false
myStatelessContainer.strictPooling = true
myStatelessContainer.sweepInterval = 5 minutes</code></pre>
</div>
</div>
<div class="paragraph">
<p>Properties and xml can be mixed. Properties will override the xml
allowing for easy configuration change without the need for $\{} style
variable substitution. Properties are not case sensitive. If a property
is specified that is not supported by the declared StatelessContainer a
warning will be logged. If a StatelessContainer is needed by the
application and one is not declared, TomEE will create one dynamically
using default settings. Multiple StatelessContainer declarations are
allowed. # Supported Properties</p>
</div>
<div class="paragraph">
<p>Property</p>
</div>
<div class="paragraph">
<p>Type</p>
</div>
<div class="paragraph">
<p>Default</p>
</div>
<div class="paragraph">
<p>Description</p>
</div>
<div class="paragraph">
<p>accessTimeout</p>
</div>
<div class="paragraph">
<p>time</p>
</div>
<div class="paragraph">
<p>30 seconds</p>
</div>
<div class="paragraph">
<p>Specifies the time an invokation should wait for an instance of the pool
to become available.</p>
</div>
<div class="paragraph">
<p>callbackThreads</p>
</div>
<div class="paragraph">
<p>int</p>
</div>
<div class="paragraph">
<p>5</p>
</div>
<div class="paragraph">
<p>The number of threads for constructing and destroying beans.</p>
</div>
<div class="paragraph">
<p>closeTimeout</p>
</div>
<div class="paragraph">
<p>time</p>
</div>
<div class="paragraph">
<p>5 minutes</p>
</div>
<div class="paragraph">
<p>Maximum time to wait for instances to be destroyed when shutting down
the pool</p>
</div>
<div class="paragraph">
<p>garbageCollection</p>
</div>
<div class="paragraph">
<p>boolean</p>
</div>
<div class="paragraph">
<p>false</p>
</div>
<div class="paragraph">
<p>Allows Garbage Collection to be used as a mechanism for shrinking the
pool.</p>
</div>
<div class="paragraph">
<p>idleTimeout</p>
</div>
<div class="paragraph">
<p>time</p>
</div>
<div class="paragraph">
<p>0 minutes</p>
</div>
<div class="paragraph">
<p>Specifies the maximum time that an instance should be allowed to sit
idly in the pool without use before it should be retired and removed.</p>
</div>
<div class="paragraph">
<p>maxAge</p>
</div>
<div class="paragraph">
<p>time</p>
</div>
<div class="paragraph">
<p>0 hours</p>
</div>
<div class="paragraph">
<p>Specifies the maximum time that an instance should live before it should
be retired and removed from use.</p>
</div>
<div class="paragraph">
<p>maxAgeOffset</p>
</div>
<div class="paragraph">
<p>int</p>
</div>
<div class="paragraph">
<p>-1</p>
</div>
<div class="paragraph">
<p>Applies to MaxAge usage and would rarely be changed, but is a nice
feature to understand.</p>
</div>
<div class="paragraph">
<p>maxSize</p>
</div>
<div class="paragraph">
<p>int</p>
</div>
<div class="paragraph">
<p>10</p>
</div>
<div class="paragraph">
<p>Specifies the size of the instance pool for this stateless SessionBean
container.</p>
</div>
<div class="paragraph">
<p>minSize</p>
</div>
<div class="paragraph">
<p>int</p>
</div>
<div class="paragraph">
<p>0</p>
</div>
<div class="paragraph">
<p>Specifies the minimum number of bean instances that should be in the
pool for each bean.</p>
</div>
<div class="paragraph">
<p>replaceAged</p>
</div>
<div class="paragraph">
<p>boolean</p>
</div>
<div class="paragraph">
<p>true</p>
</div>
<div class="paragraph">
<p>When <code>ReplaceAged</code> is enabled, any instances in the pool that expire due
to reaching their <code>MaxAge</code> will be replaced immediately so that the pool
will remain at its current size.</p>
</div>
<div class="paragraph">
<p>replaceFlushed</p>
</div>
<div class="paragraph">
<p>boolean</p>
</div>
<div class="paragraph">
<p>false</p>
</div>
<div class="paragraph">
<p>When <code>ReplaceFlushed</code> is enabled, any instances in the pool that are
flushed will be replaced immediately so that the pool will remain at its
current size.</p>
</div>
<div class="paragraph">
<p>strictPooling</p>
</div>
<div class="paragraph">
<p>boolean</p>
</div>
<div class="paragraph">
<p>true</p>
</div>
<div class="paragraph">
<p>StrictPooling tells the container what to do when the pool reaches it&#8217;s
maximum size and there are incoming requests that need instances.</p>
</div>
<div class="paragraph">
<p>sweepInterval</p>
</div>
<div class="paragraph">
<p>time</p>
</div>
<div class="paragraph">
<p>5 minutes</p>
</div>
<div class="paragraph">
<p>The frequency in which the container will sweep the pool and evict
expired instances.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_accesstimeout">accessTimeout</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Specifies the time an invokation should wait for an instance of the pool
to become available.</p>
</div>
<div class="paragraph">
<p>After the timeout is reached, if an instance in the pool cannot be
obtained, the method invocation will fail.</p>
</div>
<div class="paragraph">
<p>Usable time units: nanoseconds, microsecons, milliseconds, seconds,
minutes, hours, days. Or any combination such as "1 hour and 27 minutes
and 10 seconds"</p>
</div>
<div class="paragraph">
<p>Any usage of the <code>javax.ejb.AccessTimeout</code> annotation will override this
setting for the bean or method where the annotation is used.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_callbackthreads">callbackThreads</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The number of threads for constructing and destroying beans.</p>
</div>
<div class="paragraph">
<p>When sweeping the pool for expired instances a thread pool is used to
process calling <code>@PreDestroy</code> on expired instances as well as creating
new instances as might be required to fill the pool to the minimum after
a Flush or <code>MaxAge</code> expiration. The <code>CallbackThreads</code> setting dictates
the size of the thread pool and is shared by all beans deployed in the
container.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_closetimeout">closeTimeout</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Maximum time to wait for instances to be destroyed when shutting down
the pool</p>
</div>
<div class="paragraph">
<p>PostConstruct methods are invoked on all instances in the pool when the
bean is undeployed and its pool is closed. The <code>CloseTimeout</code> specifies
the maximum time to wait for the pool to close and <code>PostConstruct</code>
methods to be invoked.</p>
</div>
<div class="paragraph">
<p>Usable time units: nanoseconds, microsecons, milliseconds, seconds,
minutes, hours, days. Or any combination such as
<code>1 hour and 27 minutes and 10 seconds</code></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_garbagecollection">garbageCollection</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Allows Garbage Collection to be used as a mechanism for shrinking the
pool.</p>
</div>
<div class="paragraph">
<p>When set to true all instances in the pool, excluding the minimum, are
eligible for garbage collection by the virtual machine as per the rules
of <code>java.lang.ref.SoftReference</code> and can be claimed by the JVM to free
memory. Instances garbage collected will have their <code>@PreDestroy</code>
methods called during finalization.</p>
</div>
<div class="paragraph">
<p>In the OpenJDK VM the <code>-XX:SoftRefLRUPolicyMSPerMB</code> flag can adjust how
aggressively SoftReferences are collected. The default OpenJDK setting
is 1000, resulting in inactive pooled instances living one second of
lifetime per free megabyte in the heap, which is very aggressive. The
setting should be increased to get the most out of the
<code>GarbageCollection</code> feature of the pool. Much higher settings are safe.
Even a setting as high as 3600000 (1 hour per free MB in the heap) does
not affect the ability for the VM to garbage collect SoftReferences in
the event that memory is needed to avoid an <code>OutOfMemoryException</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_idletimeout">idleTimeout</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Specifies the maximum time that an instance should be allowed to sit
idly in the pool without use before it should be retired and removed.</p>
</div>
<div class="paragraph">
<p>Only instances in surplus of the pool&#8217;s <code>MinSize</code> are eligible to expire
via <code>IdleTimeout</code> Instances that expire due to <code>IdleTimeout</code> will have
their <code>@PreDestroy</code> methods invoked before being completely destroyed.</p>
</div>
<div class="paragraph">
<p>Usable time units: nanoseconds, microsecons, milliseconds, seconds,
minutes, hours, days. Or any combination such as "1 hour and 27 minutes
and 10 seconds"</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_maxage">maxAge</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Specifies the maximum time that an instance should live before it should
be retired and removed from use.</p>
</div>
<div class="paragraph">
<p>This will happen gracefully. Useful for situations where bean instances
are designed to hold potentially expensive resources such as memory or
file handles and need to be periodically cleared out.</p>
</div>
<div class="paragraph">
<p>Usable time units: nanoseconds, microsecons, milliseconds, seconds,
minutes, hours, days. Or any combination such as
<code>1 hour and 27 minutes and 10 seconds</code></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_maxageoffset">maxAgeOffset</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Applies to MaxAge usage and would rarely be changed, but is a nice
feature to understand.</p>
</div>
<div class="paragraph">
<p>When the container first starts and the pool is filled to the minimum
size, all those "minimum" instances will have the same creation time and
therefore all expire at the same time dictated by the <code>MaxAge</code> setting.
To protect against this sudden drop scenario and provide a more gradual
expiration from the start the container will spread out the age of the
instances that fill the pool to the minimum using an offset.</p>
</div>
<div class="paragraph">
<p>The <code>MaxAgeOffset</code> is not the final value of the offset, but rather it
is used in creating the offset and allows the spreading to push the
initial ages into the future or into the past. The pool is filled at
startup as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">for (int i = 0; i &lt; poolMin; i++) {
long ageOffset = (maxAge / poolMin * i * maxAgeOffset) % maxAge;
pool.add(new Bean(), ageOffset));
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The default <code>MaxAgeOffset</code> is -1 which causes the initial instances in
the pool to live a bit longer before expiring. As a concrete example,
let&#8217;s say the MinSize is 4 and the MaxAge is 100 years. The generated
offsets for the four instances created at startup would be 0, -25, -50,
-75. So the first instance would be "born" at age 0, die at 100, living
100 years. The second instance would be born at -25, die at 100, living
a total of 125 years. The third would live 150 years. The fourth 175
years.</p>
</div>
<div class="paragraph">
<p>A <code>MaxAgeOffset</code> of 1 would cause instances to be "born" older and
therefore die sooner. Using the same example <code>MinSize</code> of 4 and <code>MaxAge</code>
of <code>100 years</code>, the life spans of these initial four instances would be
100, 75, 50, and 25 years respectively.</p>
</div>
<div class="paragraph">
<p>A <code>MaxAgeOffset</code> of 0 will cause no "spreading" of the age of the first
instances used to fill the pool to the minimum and these instances will
of course reach their MaxAge at the same time. It is possible to set to
decimal values such as -0.5, 0.5, -1.2, or 1.2.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_maxsize">maxSize</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Specifies the size of the instance pool for this stateless SessionBean
container.</p>
</div>
<div class="paragraph">
<p>Each <code>@Stateless</code> bean will get its own instance pool. If StrictPooling
is not used, instances will still be created beyond this number if there
is demand, but they will not be returned to the pool and instead will be
immediately expire.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_minsize">minSize</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Specifies the minimum number of bean instances that should be in the
pool for each bean.</p>
</div>
<div class="paragraph">
<p>Pools are prefilled to the minimum on startup. Note this will create
start order dependencies between other beans that also eagerly start,
such as other <code>@Stateless</code> beans with a minimum or <code>@Singleton</code> beans
using <code>@Startup</code>. The <code>@DependsOn</code> annotation can be used to
appropriately influence start order.</p>
</div>
<div class="paragraph">
<p>The minimum pool size is rigidly maintained. Instances in the minimum
side of the pool are not eligible for <code>IdleTimeout</code> or
<code>GarbageCollection</code>, but are subject to <code>MaxAge</code> and flushing.</p>
</div>
<div class="paragraph">
<p>If the pool is flushed it is immediately refilled to the minimum size
with <code>MaxAgeOffset</code> applied. If an instance from the minimum side of the
pool reaches its <code>MaxAge</code>, it is also immediately replaced. Replacement
is done in a background queue using the number of threads specified by
<code>CallbackThreads</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_replaceaged">replaceAged</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When <code>ReplaceAged</code> is enabled, any instances in the pool that expire due
to reaching their <code>MaxAge</code> will be replaced immediately so that the pool
will remain at its current size.</p>
</div>
<div class="paragraph">
<p>Replacement is done in a background queue so that incoming threads will
not have to wait for instance creation.</p>
</div>
<div class="paragraph">
<p>The aim of his option is to prevent user requests from paying the
instance creation cost as <code>MaxAge</code> is enforced, potentially while under
heavy load at peak hours.</p>
</div>
<div class="paragraph">
<p>Instances from the minimum side of the pool are always replaced when
they reach their <code>MaxAge</code>, this setting dictates the treatment of
non-minimum instances.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_replaceflushed">replaceFlushed</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When <code>ReplaceFlushed</code> is enabled, any instances in the pool that are
flushed will be replaced immediately so that the pool will remain at its
current size.</p>
</div>
<div class="paragraph">
<p>Replacement is done in a background queue so that incoming threads will
not have to wait for instance creation.</p>
</div>
<div class="paragraph">
<p>The aim of his option is to prevent user requests from paying the
instance creation cost if a flush performed while under heavy load at
peak hours.</p>
</div>
<div class="paragraph">
<p>Instances from the minimum side of the pool are always replaced when
they are flushed, this setting dictates the treatment of non-minimum
instances.</p>
</div>
<div class="paragraph">
<p>A bean may flush its pool by casting the <code>SessionContext</code> to <code>Flushable</code>
and calling <code>flush()</code>. See <code>SweepInterval</code> for details on how flush is
performed.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import java.io.Flushable;
import java.io.IOException;
public class MyBean {
private SessionContext sessionContext;
public void flush() throws IOException {
((Flushable) sessionContext).flush();
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_strictpooling">strictPooling</h2>
<div class="sectionbody">
<div class="paragraph">
<p>StrictPooling tells the container what to do when the pool reaches it&#8217;s
maximum size and there are incoming requests that need instances.</p>
</div>
<div class="paragraph">
<p>With strict pooling, requests will have to wait for instances to become
available. The pool size will never grow beyond the the set <code>MaxSize</code>
value. The maximum amount of time a request should wait is specified via
the <code>AccessTimeout</code> setting.</p>
</div>
<div class="paragraph">
<p>Without strict pooling, the container will create temporary instances to
meet demand. The instances will last for just one method invocation and
then are removed.</p>
</div>
<div class="paragraph">
<p>Setting <code>StrictPooling</code> to <code>false</code> and <code>MaxSize</code> to <code>0</code> will result in
no pooling. Instead instances will be created on demand and live for
exactly one method call before being removed.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_sweepinterval">sweepInterval</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The frequency in which the container will sweep the pool and evict
expired instances.</p>
</div>
<div class="paragraph">
<p>Eviction is how the <code>IdleTimeout</code>, <code>MaxAge</code>, and pool "flush"
functionality is enforced. Higher intervals are better.</p>
</div>
<div class="paragraph">
<p>Instances in use are excluded from sweeping. Should an instance expire
while in use it will be evicted immediately upon return to the pool.
Effectively <code>MaxAge</code> and flushes will be enforced as a part of normal
activity or sweeping, while IdleTimeout is only enforcable via sweeping.
This makes aggressive sweeping less important for a pool under moderate
load.</p>
</div>
<div class="paragraph">
<p>Usable time units: nanoseconds, microsecons, milliseconds, seconds,
minutes, hours, days. Or any combination such as
<code>1 hour and 27 minutes and 10 seconds</code></p>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>