blob: 9048196c02b5325049ce566c66593a3ac81ba1dd [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<title>ContextService</title>
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
<link rel="shortcut icon" href="/img/jakarta-favicon.ico">
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="ContextService";
}
}
catch(err) {
}
//-->
var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</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">
<li><a href="../../../jakarta/enterprise/concurrent/Asynchronous.Result.html" title="class in jakarta.enterprise.concurrent"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../jakarta/enterprise/concurrent/ContextServiceDefinition.html" title="annotation in jakarta.enterprise.concurrent"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?jakarta/enterprise/concurrent/ContextService.html" target="_top">Frames</a></li>
<li><a href="ContextService.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../allclasses-noframe.html">All&nbsp;Classes</a></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>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&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>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">jakarta.enterprise.concurrent</div>
<h2 title="Interface ContextService" class="title">Interface ContextService</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public interface <span class="typeNameLabel">ContextService</span></pre>
<div class="block">The ContextService provides methods for creating dynamic proxy objects
(as defined by <code>java.lang.reflect.Proxy</code>).
ContextService also creates proxy objects for functional interfaces
(such as <code>Function</code>) that can be used as
completion stage actions. Proxy objects run with
the addition of context typically associated with applications executing in a
Jakarta&trade; EE environment.
Examples of such context are classloading, namespace, security, etc.
<p>
The proxy objects follow the same rules as defined for the
<code>java.lang.reflect.Proxy</code> class with the following additions:
<ul>
<li>The proxy instance will retain the context of the creator's
thread.
<li>The proxy instance will implement all of the interfaces specified on the
<code>createContextualProxy</code> methods.
<li>The object to have a proxy instance created for should not be a
component managed by the Jakarta EE Product Provider, such as a web
component or a Jakarta Enterprise Bean.
<li>All interface method invocations on a proxy instance run in the
creator's context with the exception of <code>hashCode</code>,
<code>equals</code>, <code>toString</code> and all other methods declared in
<code>Object</code>.
<li>The proxy instance must implement <code>Serializable</code>
if the proxied object instance is serializable.
<li>The proxied object instance must implement
<code>Serializable</code> if the proxy instance is serialized.
<li>Execution properties can be stored with the proxy instance. Custom
property keys must not begin with "jakarta.enterprise.concurrent.".
<li>Execution properties are to be used for controlling how various contextual
information is retrieved and applied to the thread. Although application
components can store arbitrary property keys and values, it is not
recommended. Jakarta EE product providers may impose limits to the
size of the keys and values.
</ul>
<p>
For example, to contextualize a single completion stage action
such that it is able to access the namespace of the application component,
<pre>
contextSvc = InitialContext.doLookup("java:comp/DefaultContextService");
stage2 = stage1.thenApply(contextSvc.contextualFunction(i -&gt; {
DataSource ds = InitialContext.doLookup("java:comp/env/dsRef");
try (Connection con = ds.getConnection()) {
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setInt(1, i);
ResultSet result = stmt.executeQuery();
return result.next() ? result.getInt(1) : 0;
}
}));
</pre>
<p></div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>1.0</dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<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="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>&lt;R&gt;&nbsp;java.util.concurrent.Callable&lt;R&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualCallable-java.util.concurrent.Callable-">contextualCallable</a></span>(java.util.concurrent.Callable&lt;R&gt;&nbsp;callable)</code>
<div class="block">Wraps a <code>Callable</code> with context
that is captured from the thread that invokes
<code>contextualCallable</code>.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>&lt;T,U&gt;&nbsp;java.util.function.BiConsumer&lt;T,U&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualConsumer-java.util.function.BiConsumer-">contextualConsumer</a></span>(java.util.function.BiConsumer&lt;T,U&gt;&nbsp;consumer)</code>
<div class="block">Wraps a <code>BiConsumer</code> with context
that is captured from the thread that invokes
<code>contextualConsumer</code>.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>&lt;T&gt;&nbsp;java.util.function.Consumer&lt;T&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualConsumer-java.util.function.Consumer-">contextualConsumer</a></span>(java.util.function.Consumer&lt;T&gt;&nbsp;consumer)</code>
<div class="block">Wraps a <code>Consumer</code> with context
that is captured from the thread that invokes
<code>contextualConsumer</code>.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>&lt;T,U,R&gt;&nbsp;java.util.function.BiFunction&lt;T,U,R&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualFunction-java.util.function.BiFunction-">contextualFunction</a></span>(java.util.function.BiFunction&lt;T,U,R&gt;&nbsp;function)</code>
<div class="block">Wraps a <code>BiFunction</code> with context
that is captured from the thread that invokes
<code>contextualFunction</code>.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>&lt;T,R&gt;&nbsp;java.util.function.Function&lt;T,R&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualFunction-java.util.function.Function-">contextualFunction</a></span>(java.util.function.Function&lt;T,R&gt;&nbsp;function)</code>
<div class="block">Wraps a <code>BiFunction</code> with context
that is captured from the thread that invokes
<code>contextualFunction</code>.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>java.lang.Runnable</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualRunnable-java.lang.Runnable-">contextualRunnable</a></span>(java.lang.Runnable&nbsp;runnable)</code>
<div class="block">Wraps a <code>Runnable</code> with context
that is captured from the thread that invokes
<code>contextualRunnable</code>.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>&lt;R&gt;&nbsp;java.util.function.Supplier&lt;R&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#contextualSupplier-java.util.function.Supplier-">contextualSupplier</a></span>(java.util.function.Supplier&lt;R&gt;&nbsp;supplier)</code>
<div class="block">Wraps a <code>Supplier</code> with context captured from the thread that invokes
<code>contextualSupplier</code>.</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>java.lang.Object</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#createContextualProxy-java.lang.Object-java.lang.Class...-">createContextualProxy</a></span>(java.lang.Object&nbsp;instance,
java.lang.Class&lt;?&gt;...&nbsp;interfaces)</code>
<div class="block">Creates a new contextual object proxy for the input object instance.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>java.lang.Object</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#createContextualProxy-java.lang.Object-java.util.Map-java.lang.Class...-">createContextualProxy</a></span>(java.lang.Object&nbsp;instance,
java.util.Map&lt;java.lang.String,java.lang.String&gt;&nbsp;executionProperties,
java.lang.Class&lt;?&gt;...&nbsp;interfaces)</code>
<div class="block">Creates a new contextual object proxy for the input object instance.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>&lt;T&gt;&nbsp;T</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#createContextualProxy-T-java.lang.Class-">createContextualProxy</a></span>(T&nbsp;instance,
java.lang.Class&lt;T&gt;&nbsp;intf)</code>
<div class="block">Creates a new contextual object proxy for the input object instance.</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>&lt;T&gt;&nbsp;T</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#createContextualProxy-T-java.util.Map-java.lang.Class-">createContextualProxy</a></span>(T&nbsp;instance,
java.util.Map&lt;java.lang.String,java.lang.String&gt;&nbsp;executionProperties,
java.lang.Class&lt;T&gt;&nbsp;intf)</code>
<div class="block">Creates a new contextual object proxy for the input object instance.</div>
</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>java.util.concurrent.Executor</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#currentContextExecutor--">currentContextExecutor</a></span>()</code>
<div class="block">Captures thread context as an <code>Executor</code>
that runs tasks on the same thread from which
<code>execute</code>is invoked but with context that is captured from the thread
that invokes <code>currentContextExecutor</code>.</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>java.util.Map&lt;java.lang.String,java.lang.String&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#getExecutionProperties-java.lang.Object-">getExecutionProperties</a></span>(java.lang.Object&nbsp;contextualProxy)</code>
<div class="block">Gets the current execution properties on the context proxy instance.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>&lt;T&gt;&nbsp;java.util.concurrent.CompletableFuture&lt;T&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#withContextCapture-java.util.concurrent.CompletableFuture-">withContextCapture</a></span>(java.util.concurrent.CompletableFuture&lt;T&gt;&nbsp;stage)</code>
<div class="block">Returns a new <code>CompletableFuture</code> that is completed by the completion of the
specified stage.</div>
</td>
</tr>
<tr id="i14" class="altColor">
<td class="colFirst"><code>&lt;T&gt;&nbsp;java.util.concurrent.CompletionStage&lt;T&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../jakarta/enterprise/concurrent/ContextService.html#withContextCapture-java.util.concurrent.CompletionStage-">withContextCapture</a></span>(java.util.concurrent.CompletionStage&lt;T&gt;&nbsp;stage)</code>
<div class="block">Returns a new <code>CompletionStage</code> that is completed by the completion of the
specified stage.</div>
</td>
</tr>
</table>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="contextualCallable-java.util.concurrent.Callable-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualCallable</h4>
<pre>&lt;R&gt;&nbsp;java.util.concurrent.Callable&lt;R&gt;&nbsp;contextualCallable(java.util.concurrent.Callable&lt;R&gt;&nbsp;callable)</pre>
<div class="block"><p>Wraps a <code>Callable</code> with context
that is captured from the thread that invokes
<code>contextualCallable</code>. Context is captured at the time <code>contextualCallable</code> is invoked.</p>
<p>When <code>call</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>call</code> method,
then the <code>call</code> method of the provided <code>Callable</code> is invoked.
Finally, the previous context is restored on the thread, and the result of the
<code>Callable</code> is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>R</code> - callable result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>callable</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>call</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>Callable</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualConsumer-java.util.function.BiConsumer-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualConsumer</h4>
<pre>&lt;T,U&gt;&nbsp;java.util.function.BiConsumer&lt;T,U&gt;&nbsp;contextualConsumer(java.util.function.BiConsumer&lt;T,U&gt;&nbsp;consumer)</pre>
<div class="block"><p>Wraps a <code>BiConsumer</code> with context
that is captured from the thread that invokes
<code>contextualConsumer</code>. Context is captured at the time <code>contextualConsumer</code> is invoked.</p>
<p>When <code>accept</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>accept</code> method,
then the <code>accept</code> method of the provided <code>BiConsumer</code> is invoked.
Finally, the previous context is restored on the thread, and control is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - type of first parameter to consumer.</dd>
<dd><code>U</code> - type of second parameter to consumer.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>consumer</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>accept</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>BiConsumer</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualConsumer-java.util.function.Consumer-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualConsumer</h4>
<pre>&lt;T&gt;&nbsp;java.util.function.Consumer&lt;T&gt;&nbsp;contextualConsumer(java.util.function.Consumer&lt;T&gt;&nbsp;consumer)</pre>
<div class="block"><p>Wraps a <code>Consumer</code> with context
that is captured from the thread that invokes
<code>contextualConsumer</code>. Context is captured at the time <code>contextualConsumer</code> is invoked.</p>
<p>When <code>accept</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>accept</code> method,
then the <code>accept</code> method of the provided <code>Consumer</code> is invoked.
Finally, the previous context is restored on the thread, and control is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - type of parameter to consumer.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>consumer</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>accept</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>Consumer</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualFunction-java.util.function.BiFunction-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualFunction</h4>
<pre>&lt;T,U,R&gt;&nbsp;java.util.function.BiFunction&lt;T,U,R&gt;&nbsp;contextualFunction(java.util.function.BiFunction&lt;T,U,R&gt;&nbsp;function)</pre>
<div class="block"><p>Wraps a <code>BiFunction</code> with context
that is captured from the thread that invokes
<code>contextualFunction</code>. Context is captured at the time <code>contextualFunction</code> is invoked.</p>
<p>When <code>apply</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>apply</code> method,
then the <code>apply</code> method of the provided <code>BiFunction</code> is invoked.
Finally, the previous context is restored on the thread, and the result of the
<code>BiFunction</code> is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - type of first parameter to function.</dd>
<dd><code>U</code> - type of second parameter to function.</dd>
<dd><code>R</code> - function result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>function</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>apply</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>BiFunction</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualFunction-java.util.function.Function-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualFunction</h4>
<pre>&lt;T,R&gt;&nbsp;java.util.function.Function&lt;T,R&gt;&nbsp;contextualFunction(java.util.function.Function&lt;T,R&gt;&nbsp;function)</pre>
<div class="block"><p>Wraps a <code>BiFunction</code> with context
that is captured from the thread that invokes
<code>contextualFunction</code>. Context is captured at the time <code>contextualFunction</code> is invoked.</p>
<p>When <code>apply</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>apply</code> method,
then the <code>apply</code> method of the provided <code>Function</code> is invoked.
Finally, the previous context is restored on the thread, and the result of the
<code>Function</code> is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - type of parameter to function.</dd>
<dd><code>R</code> - function result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>function</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>apply</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>Function</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualRunnable-java.lang.Runnable-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualRunnable</h4>
<pre>java.lang.Runnable&nbsp;contextualRunnable(java.lang.Runnable&nbsp;runnable)</pre>
<div class="block"><p>Wraps a <code>Runnable</code> with context
that is captured from the thread that invokes
<code>contextualRunnable</code>. Context is captured at the time <code>contextualRunnable</code> is invoked.</p>
<p>When <code>run</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>run</code> method,
then the <code>run</code> method of the provided <code>Runnable</code> is invoked.
Finally, the previous context is restored on the thread, and control is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>runnable</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>run</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>Runnable</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="contextualSupplier-java.util.function.Supplier-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>contextualSupplier</h4>
<pre>&lt;R&gt;&nbsp;java.util.function.Supplier&lt;R&gt;&nbsp;contextualSupplier(java.util.function.Supplier&lt;R&gt;&nbsp;supplier)</pre>
<div class="block"><p>Wraps a <code>Supplier</code> with context captured from the thread that invokes
<code>contextualSupplier</code>. Context is captured at the time <code>contextualSupplier</code> is invoked.</p>
<p>When <code>supply</code> is invoked on the proxy instance,
context is first established on the thread that will run the <code>supply</code> method,
then the <code>supply</code> method of the provided <code>Supplier</code> is invoked.
Finally, the previous context is restored on the thread, and the result of the
<code>Supplier</code> is returned to the invoker.</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>R</code> - supplier result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>supplier</code> - instance to contextualize.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>contextualized proxy instance that wraps execution of the <code>supply</code> method with context.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - if an already-contextualized <code>Supplier</code> is supplied to this method.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="createContextualProxy-java.lang.Object-java.lang.Class-">
<!-- -->
</a><a name="createContextualProxy-T-java.lang.Class-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createContextualProxy</h4>
<pre>&lt;T&gt;&nbsp;T&nbsp;createContextualProxy(T&nbsp;instance,
java.lang.Class&lt;T&gt;&nbsp;intf)</pre>
<div class="block">Creates a new contextual object proxy for the input object instance.
<p>
Each method invocation will have the context of the application component
instance that created the contextual object proxy.
<p>
The contextual object is useful when developing or using Java&trade; SE
threading mechanisms propagating events to other component instances.
<p>
If the application component that created the proxy is not started or
deployed, all methods on reflected interfaces may throw an
<code>IllegalStateException</code>.
<p>
For example, to execute a Runnable which is contextualized with the
creator's context using a Java&trade; SE ExecutorService:
<pre>
public class MyRunnable implements Runnable {
public void run() {
System.out.println(&quot;MyRunnable.run with Jakarta EE Context available.&quot;);
}
}
InitialContext ctx = new InitialContext();
ThreadFactory threadFactory = (ThreadFactory) ctx
.lookup(&quot;java:comp/env/concurrent/ThreadFactory&quot;);
ContextService ctxService = (ContextService) ctx
.lookup(&quot;java:comp/env/concurrent/ContextService&quot;);
MyRunnable myRunnableInstance = ...;
Runnable rProxy = ctxService.createContextualProxy(myRunnableInstance, Runnable.class);
ExecutorService exSvc = Executors.newThreadPool(10, threadFactory);
Future f = exSvc.submit(rProxy);
</pre>
<p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - the type of the instance to proxy</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>instance</code> - the instance of the object to proxy.</dd>
<dd><code>intf</code> - the interface that the proxy should implement.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a proxy for the input object that implements the specified interface.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - - if the <code>intf</code> argument
is null or the instance does not implement the specified
interface.</dd>
<dd><code>java.lang.UnsupportedOperationException</code> - - if the <code>intf</code>
interface is <code>serializable</code>
but a thread context type does not support serialization.</dd>
</dl>
</li>
</ul>
<a name="createContextualProxy-java.lang.Object-java.lang.Class...-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createContextualProxy</h4>
<pre>java.lang.Object&nbsp;createContextualProxy(java.lang.Object&nbsp;instance,
java.lang.Class&lt;?&gt;...&nbsp;interfaces)</pre>
<div class="block">Creates a new contextual object proxy for the input object instance.
<p>
This method is similar to <code>&lt;T&gt; T createContextualProxy(T instance, Class&lt;T&gt; intf)</code>
except that this method can be used if the proxy has to support multiple
interfaces.
</p>
Example:
<pre>
public class MyRunnableWork implements Runnable, SomeWorkInterface {
public void run() {
System.out.println(&quot;MyRunnableWork.run with Jakarta EE Context available.&quot;);
}
public void someWorkInterfaceMethod() {
...
}
}
ThreadFactory threadFactory = ...;
ContextService ctxService = ...;
MyRunnableWork myRunnableWorkInstance = ...;
Object proxy = ctxService.createContextualProxy(myRunnableWorkInstance,
Runnable.class, SomeWorkInterface.class);
// call SomeWorkInterface method on the proxy
((SomeWorkInterface) proxy).someWorkInterfaceMethod();
ExecutorService exSvc = Executors.newThreadPool(10, threadFactory);
// submit the proxy as a Runnable to the ExecutorService
Future f = exSvc.submit( (Runnable)proxy);
</pre></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>instance</code> - the instance of the object to proxy.</dd>
<dd><code>interfaces</code> - the interfaces that the proxy should implement.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a proxy for the input object that implements all of the specified
interfaces.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - - if the <code>interfaces</code>
argument is null or the instance does not implement
all the specified interfaces.</dd>
<dd><code>java.lang.UnsupportedOperationException</code> - - if any of the <code>interfaces</code>
are <code>serializable</code> but a thread context type
does not support serialization.</dd>
</dl>
</li>
</ul>
<a name="createContextualProxy-java.lang.Object-java.util.Map-java.lang.Class-">
<!-- -->
</a><a name="createContextualProxy-T-java.util.Map-java.lang.Class-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createContextualProxy</h4>
<pre>&lt;T&gt;&nbsp;T&nbsp;createContextualProxy(T&nbsp;instance,
java.util.Map&lt;java.lang.String,java.lang.String&gt;&nbsp;executionProperties,
java.lang.Class&lt;T&gt;&nbsp;intf)</pre>
<div class="block">Creates a new contextual object proxy for the input object instance.
<p>
The contextual object is useful when developing or using Java&trade; SE
threading mechanisms propagating events to other component instances.
<p>
If the application component that created the proxy is not started or
deployed, all methods on reflected interfaces may throw an
<code>IllegalStateException</code>.
<p>
This method accepts a <code>Map</code> object which allows the
contextual object creator to define what contexts or behaviors to capture
when creating the contextual object. The specified properties will remain
with the contextual object.
<p>
For example, to call a Message Driven Bean (MDB) with the sender's
context, but within the MDB's transaction:
<pre>
public class MyServlet ... {
public void doPost() throws NamingException, JMSException {
InitialContext ctx = new InitialContext();
// Get the ContextService that only propagates
// security context.
ContextService ctxSvc = (ContextService)
ctx.lookup(&quot;java:comp/env/SecurityContext&quot;);
// Set any custom context data through execution properties
Map&lt;String, String&gt; execProps = new HashMap&lt;&gt;();
execProps.put(&quot;vendor_a.security.tokenexpiration&quot;, &quot;15000&quot;);
// Specify that contextual object should run inside the current
// transaction. If we have a failure, we don't want to consume
// the message.
execProps.put(ManagedTask.TRANSACTION, &quot;USE_TRANSACTION_OF_EXECUTION_THREAD&quot;);
ProcessMessage msgProcessor =
ctxSvc.createContextualProxy(new MessageProcessor(), execProps,
ProcessMessage.class);
ConnectionFactory cf = (ConnectionFactory)
ctx.lookup(&quot;java:comp/env/MyTopicConnectionFactory&quot;);
Destination dest = (Destination) ctx.lookup(&quot;java:comp/env/MyTopic&quot;);
Connection con = cf.createConnection();
Session session = con.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(dest);
Message msg = session.createObjectMessage((Serializable)msgProcessor);
producer.send(dest, msg);
...
}
public class MyMDB ... {
public void onMessage(Message msg) {
// Get the ProcessMessage contextual object from the message.
ObjectMessage omsg = (ObjectMessage)msg;
ProcessMessage msgProcessor = (ProcessMessage)omsg.getObject();
// Process the message in the specified context.
msgProcessor.processMessage(msg);
}
}
public interface ProcessMessage {
public void processMessage(Message msg);
}
public class MessageProcessor implements ProcessMessage, Serializable {
public void processMessage(Message msg) {
// Process the message with the application container
// context that sent the message.
}
}
</pre></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - the type of the interface</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>instance</code> - the instance of the object to proxy.</dd>
<dd><code>executionProperties</code> - the properties to use when creating and running the context
object.</dd>
<dd><code>intf</code> - the interface that the proxy should implement.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a proxy for the input object that implements the specified interface.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - - if the <code>intf</code> argument
null or the instance does not implement the specified interface.</dd>
<dd><code>java.lang.UnsupportedOperationException</code> - - if the <code>intf</code>
interface is <code>serializable</code>
but a thread context type does not support serialization.</dd>
</dl>
</li>
</ul>
<a name="createContextualProxy-java.lang.Object-java.util.Map-java.lang.Class...-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createContextualProxy</h4>
<pre>java.lang.Object&nbsp;createContextualProxy(java.lang.Object&nbsp;instance,
java.util.Map&lt;java.lang.String,java.lang.String&gt;&nbsp;executionProperties,
java.lang.Class&lt;?&gt;...&nbsp;interfaces)</pre>
<div class="block">Creates a new contextual object proxy for the input object instance.
<p>
This method is similar to
<code>&lt;T&gt; T createContextualProxy(T instance, Map&lt;String, String&gt; executionProperties, Class&lt;T&gt; intf)</code>
except that this method can be used if the proxy has to support multiple
interfaces.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>instance</code> - the instance of the object to proxy.</dd>
<dd><code>executionProperties</code> - the properties to use when creating and running the context
object.</dd>
<dd><code>interfaces</code> - the interfaces that the proxy should implement.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a proxy for the input object that implements all of the specified
interfaces.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - - if the <code>interfaces</code>
argument is null or the instance does not implement all the specified
interfaces.</dd>
<dd><code>java.lang.UnsupportedOperationException</code> - - if any of the <code>interfaces</code>
are <code>serializable</code> but a thread context type
does not support serialization.</dd>
</dl>
</li>
</ul>
<a name="currentContextExecutor--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>currentContextExecutor</h4>
<pre>java.util.concurrent.Executor&nbsp;currentContextExecutor()</pre>
<div class="block"><p>Captures thread context as an <code>Executor</code>
that runs tasks on the same thread from which
<code>execute</code>is invoked but with context that is captured from the thread
that invokes <code>currentContextExecutor</code>.</p>
<p>Example usage:</p>
<pre>
<code>Executor contextSnapshot = contextSvc.currentContextExecutor();
...
// from another thread, or after thread context has changed,
contextSnapshot.execute(() -&gt; obj.doSomethingThatNeedsContext());
contextSnapshot.execute(() -&gt; doSomethingElseThatNeedsContext(x, y));
</code></pre>
<p>The returned <code>Executor</code> must raise <code>IllegalArgumentException</code>
if an already-contextualized <code>Runnable</code> is supplied to its
<code>execute</code> method.</p></div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>an executor that wraps the <code>execute</code> method with context.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="getExecutionProperties-java.lang.Object-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getExecutionProperties</h4>
<pre>java.util.Map&lt;java.lang.String,java.lang.String&gt;&nbsp;getExecutionProperties(java.lang.Object&nbsp;contextualProxy)</pre>
<div class="block">Gets the current execution properties on the context proxy instance.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>contextualProxy</code> - the contextual proxy instance to retrieve the execution properties.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>A copy of the current contextual object execution properties, or null if
the contextualProxy is created without specifying any execution properties.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.IllegalArgumentException</code> - thrown if the input contextualProxy is not a valid
contextual object proxy created with the
<code>createContextualProxy</code> method.</dd>
</dl>
</li>
</ul>
<a name="withContextCapture-java.util.concurrent.CompletableFuture-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>withContextCapture</h4>
<pre>&lt;T&gt;&nbsp;java.util.concurrent.CompletableFuture&lt;T&gt;&nbsp;withContextCapture(java.util.concurrent.CompletableFuture&lt;T&gt;&nbsp;stage)</pre>
<div class="block"><p>Returns a new <code>CompletableFuture</code> that is completed by the completion of the
specified stage.</p>
<p>The new completable future gets its default asynchronous execution facility
from this <code>ContextService</code>,
using the same <a href="../../../jakarta/enterprise/concurrent/ManagedExecutorService.html" title="interface in jakarta.enterprise.concurrent"><code>ManagedExecutorService</code></a> if this <code>ContextService</code>
was obtained by <a href="../../../jakarta/enterprise/concurrent/ManagedExecutorService.html#getContextService--"><code>ManagedExecutorService.getContextService()</code></a>.</p>
<p>When dependent stages are created from the new completable future,
and from the dependent stages of those stages, and so on, thread context is captured
and/or cleared by the <code>ContextService</code>. This guarantees that the action
performed by each stage always runs under the thread context of the code that creates the stage,
unless the user explicitly overrides by supplying a pre-contextualized action.</p>
<p>Invocation of this method does not impact thread context propagation for the originally supplied
completable future or any other dependent stages directly created from it (not using this method).</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - completable future result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>stage</code> - a completable future whose completion triggers completion of the new completable
future that is created by this method.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the new completable future.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
<a name="withContextCapture-java.util.concurrent.CompletionStage-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>withContextCapture</h4>
<pre>&lt;T&gt;&nbsp;java.util.concurrent.CompletionStage&lt;T&gt;&nbsp;withContextCapture(java.util.concurrent.CompletionStage&lt;T&gt;&nbsp;stage)</pre>
<div class="block"><p>Returns a new <code>CompletionStage</code> that is completed by the completion of the
specified stage.</p>
<p>The new completion stage gets its default asynchronous execution facility from this <code>ContextService</code>,
using the same <a href="../../../jakarta/enterprise/concurrent/ManagedExecutorService.html" title="interface in jakarta.enterprise.concurrent"><code>ManagedExecutorService</code></a> if this <code>ContextService</code>
was obtained by <a href="../../../jakarta/enterprise/concurrent/ManagedExecutorService.html#getContextService--"><code>ManagedExecutorService.getContextService()</code></a>,
otherwise using the DefaultManagedExecutorService.</p>
<p>When dependent stages are created from the new completion stage,
and from the dependent stages of those stages, and so on, thread context is captured
and/or cleared by the <code>ContextService</code>. This guarantees that the action
performed by each stage always runs under the thread context of the code that creates the stage,
unless the user explicitly overrides by supplying a pre-contextualized action.</p>
<p>Invocation of this method does not impact thread context propagation for the originally supplied
stage or any other dependent stages directly created from it (not using this method).</p></div>
<dl>
<dt><span class="paramLabel">Type Parameters:</span></dt>
<dd><code>T</code> - completion stage result type.</dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>stage</code> - a completion stage whose completion triggers completion of the new stage
that is created by this method.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the new completion stage.</dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>3.0</dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</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">
<li><a href="../../../jakarta/enterprise/concurrent/Asynchronous.Result.html" title="class in jakarta.enterprise.concurrent"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../jakarta/enterprise/concurrent/ContextServiceDefinition.html" title="annotation in jakarta.enterprise.concurrent"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?jakarta/enterprise/concurrent/ContextService.html" target="_top">Frames</a></li>
<li><a href="ContextService.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../allclasses-noframe.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>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&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>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>