<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="executor.html">

  &project;

  <properties>
    <author email="fhanik@apache.org">Filip Hanik</author>
    <title>The Executor (thread pool)</title>
  </properties>

<body>

<section name="Table of Contents">
<toc/>
</section>

<section name="Introduction">

  <p>The <strong>Executor</strong> represents a thread pool that can be shared
     between components in Tomcat. Historically there has been a thread pool per
     connector created but this allows you to share a thread pool, between (primarly) connector
     but also other components when those get configured to support executors</p>


  <p>The executor has to implement the <code>org.apache.catalina.Executor</code> interface.</p>

  <p>The executor is a nested element to the <a href="service.html">Service</a> element.
     And in order for it to be picked up by the connectors, the Executor element has to appear
     prior to the Connector element in server.xml</p>
</section>


<section name="Attributes">

  <subsection name="Common Attributes">

  <p>All implementations of <strong>Executor</strong>
  support the following attributes:</p>

  <attributes>

    <attribute name="className" required="false">
      <p>The class of the implementation. The implementation has to implement the
         <code>org.apache.catalina.Executor</code> interface.
         This interface ensures that the object can be referenced through its <code>name</code> attribute
         and that implements Lifecycle, so that it can be started and stopped with the container.
         The default value for the className is <code>org.apache.catalina.core.StandardThreadExecutor</code></p>
    </attribute>

    <attribute name="name" required="true">
      <p>The name used to reference this pool in other places in server.xml.
         The name is required and must be unique.</p>
    </attribute>

  </attributes>

  </subsection>

  <subsection name="Standard Implementation">

  <p>
  The default implementation supports the following attributes:</p>

  <attributes>

    <attribute name="threadPriority" required="false">
      <p>(int) The thread priority for threads in the executor, the default is
      <code>5</code> (the value of the <code>Thread.NORM_PRIORITY</code> constant)</p>
    </attribute>
    <attribute name="daemon" required="false">
      <p>(boolean) Whether the threads should be daemon threads or not, the default is <code>true</code></p>
    </attribute>
    <attribute name="namePrefix" required="false">
      <p>(String) The name prefix for each thread created by the executor.
         The thread name for an individual thread will be <code>namePrefix+threadNumber</code></p>
    </attribute>
    <attribute name="maxThreads" required="false">
      <p>(int) The max number of active threads in this pool, default is <code>200</code></p>
    </attribute>
    <attribute name="minSpareThreads" required="false">
      <p>(int) The minimum number of threads always kept alive, default is <code>25</code></p>
    </attribute>
    <attribute name="maxIdleTime" required="false">
      <p>(int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less
         or equal to minSpareThreads. Default value is <code>60000</code>(1 minute)</p>
    </attribute>
    <attribute name="maxQueueSize" required="false">
      <p>(int) The maximum number of runnable tasks that can queue up awaiting
        execution before we reject them. Default value is <code>Integer.MAX_VALUE</code></p>
    </attribute>
    <attribute name="prestartminSpareThreads" required="false">
      <p>(boolean) Whether minSpareThreads should be started when starting the Executor or not,
          the default is <code>false</code></p>
    </attribute>
    <attribute name="threadRenewalDelay" required="false">
      <p>(long) If a <a href="listeners.html">ThreadLocalLeakPreventionListener</a> is configured,
        it will notify this executor about stopped contexts.
        After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time,
        this option sets a delay between renewal of any 2 threads. The value is in ms,
        default value is <code>1000</code> ms. If value is negative, threads are not renewed.</p>
    </attribute>
  </attributes>


  </subsection>
</section>


</body>

</document>
