blob: ccea974b405f3713c56d05c051ce297715d406ee [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.10) on Fri Feb 26 09:50:23 CST 2021 -->
<title>QoSFilter (Jetty :: Project 9.4.38.v20210224 API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2021-02-26">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../jquery/jquery-3.5.1.js"></script>
<script type="text/javascript" src="../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="QoSFilter (Jetty :: Project 9.4.38.v20210224 API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../";
var useModuleDirectories = false;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/QoSFilter.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.eclipse.jetty.servlets</a></div>
<h2 title="Class QoSFilter" class="title">Class QoSFilter</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.eclipse.jetty.servlets.QoSFilter</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code>javax.servlet.Filter</code></dd>
</dl>
<hr>
<pre><a href="../util/annotation/ManagedObject.html" title="annotation in org.eclipse.jetty.util.annotation">@ManagedObject</a>("Quality of Service Filter")
public class <span class="typeNameLabel">QoSFilter</span>
extends java.lang.Object
implements javax.servlet.Filter</pre>
<div class="block">Quality of Service Filter.
<p>
This filter limits the number of active requests to the number set by the "maxRequests" init parameter (default 10).
If more requests are received, they are suspended and placed on priority queues. Priorities are determined by
the <a href="#getPriority(javax.servlet.ServletRequest)"><code>getPriority(ServletRequest)</code></a> method and are a value between 0 and the value given by the "maxPriority"
init parameter (default 10), with higher values having higher priority.
<p>
This filter is ideal to prevent wasting threads waiting for slow/limited
resources such as a JDBC connection pool. It avoids the situation where all of a
containers thread pool may be consumed blocking on such a slow resource.
By limiting the number of active threads, a smaller thread pool may be used as
the threads are not wasted waiting. Thus more memory may be available for use by
the active threads.
<p>
Furthermore, this filter uses a priority when resuming waiting requests. So that if
a container is under load, and there are many requests waiting for resources,
the <a href="#getPriority(javax.servlet.ServletRequest)"><code>getPriority(ServletRequest)</code></a> method is used, so that more important
requests are serviced first. For example, this filter could be deployed with a
maxRequest limit slightly smaller than the containers thread pool and a high priority
allocated to admin users. Thus regardless of load, admin users would always be
able to access the web application.
<p>
The maxRequest limit is policed by a <code>Semaphore</code> and the filter will wait a short while attempting to acquire
the semaphore. This wait is controlled by the "waitMs" init parameter and allows the expense of a suspend to be
avoided if the semaphore is shortly available. If the semaphore cannot be obtained, the request will be suspended
for the default suspend period of the container or the valued set as the "suspendMs" init parameter.
<p>
If the "managedAttr" init parameter is set to true, then this servlet is set as a <code>ServletContext</code> attribute with the
filter name as the attribute name. This allows context external mechanism (eg JMX via <a href="../server/handler/ContextHandler.html#MANAGED_ATTRIBUTES"><code>ContextHandler.MANAGED_ATTRIBUTES</code></a>) to
manage the configuration of the filter.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">QoSFilter</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#destroy()">destroy</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)">doFilter</a></span>&#8203;(javax.servlet.ServletRequest&nbsp;request,
javax.servlet.ServletResponse&nbsp;response,
javax.servlet.FilterChain&nbsp;chain)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getMaxRequests()">getMaxRequests</a></span>()</code></th>
<td class="colLast">
<div class="block">Get the maximum number of requests allowed to be processed
at the same time.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>protected int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getPriority(javax.servlet.ServletRequest)">getPriority</a></span>&#8203;(javax.servlet.ServletRequest&nbsp;request)</code></th>
<td class="colLast">
<div class="block">Computes the request priority.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getSuspendMs()">getSuspendMs</a></span>()</code></th>
<td class="colLast">
<div class="block">Get the amount of time (in milliseconds) that the filter would suspend
a request for while waiting for the semaphore to become available.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getWaitMs()">getWaitMs</a></span>()</code></th>
<td class="colLast">
<div class="block">Get the (short) amount of time (in milliseconds) that the filter would wait
for the semaphore to become available before suspending a request.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#init(javax.servlet.FilterConfig)">init</a></span>&#8203;(javax.servlet.FilterConfig&nbsp;filterConfig)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setMaxRequests(int)">setMaxRequests</a></span>&#8203;(int&nbsp;value)</code></th>
<td class="colLast">
<div class="block">Set the maximum number of requests allowed to be processed
at the same time.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setSuspendMs(long)">setSuspendMs</a></span>&#8203;(long&nbsp;value)</code></th>
<td class="colLast">
<div class="block">Set the amount of time (in milliseconds) that the filter would suspend
a request for while waiting for the semaphore to become available.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setWaitMs(long)">setWaitMs</a></span>&#8203;(long&nbsp;value)</code></th>
<td class="colLast">
<div class="block">Set the (short) amount of time (in milliseconds) that the filter would wait
for the semaphore to become available before suspending a request.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>QoSFilter</h4>
<pre>public&nbsp;QoSFilter()</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="init(javax.servlet.FilterConfig)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>init</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;init&#8203;(javax.servlet.FilterConfig&nbsp;filterConfig)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>init</code>&nbsp;in interface&nbsp;<code>javax.servlet.Filter</code></dd>
</dl>
</li>
</ul>
<a id="doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>doFilter</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;doFilter&#8203;(javax.servlet.ServletRequest&nbsp;request,
javax.servlet.ServletResponse&nbsp;response,
javax.servlet.FilterChain&nbsp;chain)
throws java.io.IOException,
javax.servlet.ServletException</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>doFilter</code>&nbsp;in interface&nbsp;<code>javax.servlet.Filter</code></dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code></dd>
<dd><code>javax.servlet.ServletException</code></dd>
</dl>
</li>
</ul>
<a id="getPriority(javax.servlet.ServletRequest)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPriority</h4>
<pre class="methodSignature">protected&nbsp;int&nbsp;getPriority&#8203;(javax.servlet.ServletRequest&nbsp;request)</pre>
<div class="block">Computes the request priority.
<p>
The default implementation assigns the following priorities:
<ul>
<li> 2 - for an authenticated request
<li> 1 - for a request with valid / non new session
<li> 0 - for all other requests.
</ul>
This method may be overridden to provide application specific priorities.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>request</code> - the incoming request</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the computed request priority</dd>
</dl>
</li>
</ul>
<a id="destroy()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>destroy</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;destroy()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>destroy</code>&nbsp;in interface&nbsp;<code>javax.servlet.Filter</code></dd>
</dl>
</li>
</ul>
<a id="getWaitMs()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getWaitMs</h4>
<pre class="methodSignature"><a href="../util/annotation/ManagedAttribute.html" title="annotation in org.eclipse.jetty.util.annotation">@ManagedAttribute</a>("(short) amount of time filter will wait before suspending request (in ms)")
public&nbsp;long&nbsp;getWaitMs()</pre>
<div class="block">Get the (short) amount of time (in milliseconds) that the filter would wait
for the semaphore to become available before suspending a request.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>wait time (in milliseconds)</dd>
</dl>
</li>
</ul>
<a id="setWaitMs(long)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setWaitMs</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setWaitMs&#8203;(long&nbsp;value)</pre>
<div class="block">Set the (short) amount of time (in milliseconds) that the filter would wait
for the semaphore to become available before suspending a request.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>value</code> - wait time (in milliseconds)</dd>
</dl>
</li>
</ul>
<a id="getSuspendMs()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSuspendMs</h4>
<pre class="methodSignature"><a href="../util/annotation/ManagedAttribute.html" title="annotation in org.eclipse.jetty.util.annotation">@ManagedAttribute</a>("amount of time filter will suspend a request for while waiting for the semaphore to become available (in ms)")
public&nbsp;long&nbsp;getSuspendMs()</pre>
<div class="block">Get the amount of time (in milliseconds) that the filter would suspend
a request for while waiting for the semaphore to become available.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>suspend time (in milliseconds)</dd>
</dl>
</li>
</ul>
<a id="setSuspendMs(long)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSuspendMs</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setSuspendMs&#8203;(long&nbsp;value)</pre>
<div class="block">Set the amount of time (in milliseconds) that the filter would suspend
a request for while waiting for the semaphore to become available.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>value</code> - suspend time (in milliseconds)</dd>
</dl>
</li>
</ul>
<a id="getMaxRequests()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getMaxRequests</h4>
<pre class="methodSignature"><a href="../util/annotation/ManagedAttribute.html" title="annotation in org.eclipse.jetty.util.annotation">@ManagedAttribute</a>("maximum number of requests to allow processing of at the same time")
public&nbsp;int&nbsp;getMaxRequests()</pre>
<div class="block">Get the maximum number of requests allowed to be processed
at the same time.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>maximum number of requests</dd>
</dl>
</li>
</ul>
<a id="setMaxRequests(int)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>setMaxRequests</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setMaxRequests&#8203;(int&nbsp;value)</pre>
<div class="block">Set the maximum number of requests allowed to be processed
at the same time.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>value</code> - the number of requests</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/QoSFilter.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 1995&#x2013;2021 <a href="https://webtide.com">Webtide</a>. All rights reserved.</small></p>
</footer>
</body>
</html>