blob: b83fe50e3e4199e07580d32c1a1f6dcc474be176 [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>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(72949126, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/72949126" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
<script type='text/javascript'>
window.__lo_site_id = 284467;
(function() {
var wa = document.createElement('script'); wa.type = 'text/javascript'; wa.async = true;
wa.src = 'https://d10lpsik1i8c69.cloudfront.net/w.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wa, s);
})();
</script>
<link rel="canonical" href="https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/compute/gridify/Gridify.html" />
<!-- Generated by javadoc (1.8.0_261) on Wed Dec 09 14:33:08 MSK 2020 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Gridify (Ignite 2.9.1)</title>
<meta name="date" content="2020-12-09">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<link rel='shortcut icon' href='https://ignite.apache.org/favicon.ico'/>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-61232409-1', 'auto');
ga('send', 'pageview');
</script></head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Gridify (Ignite 2.9.1)";
}
}
catch(err) {
}
//-->
</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="class-use/Gridify.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">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../org/apache/ignite/compute/gridify/GridifyArgument.html" title="interface in org.apache.ignite.compute.gridify"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/ignite/compute/gridify/Gridify.html" target="_top">Frames</a></li>
<li><a href="Gridify.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>Field&nbsp;|&nbsp;</li>
<li>Required&nbsp;|&nbsp;</li>
<li><a href="#annotation.type.optional.element.summary">Optional</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#annotation.type.element.detail">Element</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">org.apache.ignite.compute.gridify</div>
<h2 title="Annotation Type Gridify" class="title">Annotation Type Gridify</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Documented.html?is-external=true" title="class or interface in java.lang.annotation">@Documented</a>
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html?is-external=true" title="class or interface in java.lang.annotation">@Retention</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html?is-external=true#value--" title="class or interface in java.lang.annotation">value</a>=<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html?is-external=true#RUNTIME" title="class or interface in java.lang.annotation">RUNTIME</a>)
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html?is-external=true" title="class or interface in java.lang.annotation">@Target</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html?is-external=true#value--" title="class or interface in java.lang.annotation">value</a>=<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html?is-external=true#METHOD" title="class or interface in java.lang.annotation">METHOD</a>)
public @interface <span class="memberNameLabel">Gridify</span></pre>
<div class="block"><code>Gridify</code> annotation is the main way to grid-enable existing code.
<p>
This annotation can be applied to any public method that needs to be grid-enabled,
static or non-static. When this annotation is applied to a method, the method
execution is considered to be grid-enabled. In general, the execution of this
method can be transferred to another node in the grid, potentially splitting it
into multiple subtasks to be executed in parallel on multiple grid nodes. But
from the caller perspective this method still looks and behaves like a local apply.
This is achieved by utilizing AOP-based interception of the annotated code and
injecting all the necessary grid logic into the method execution.
<p>
By default, when neither <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskClass--"><code>taskClass()</code></a> or <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskName--"><code>taskName()</code></a> are specified
a method with <code>@Gridify</code> annotation will be executed on randomly picked remote node.
<p>
Note that when using <code>@Gridify</code> annotation with default task (without
specifying explicit grid task), the state of the whole instance will be
serialized and sent out to remote node. Therefore the class must implement
<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io"><code>Serializable</code></a> interface. If you cannot make the class <code>Serializable</code>,
then you must implement custom grid task which will take care of proper state
initialization. In either case, Ignite must be able to serialize the state passed to remote node.
<p>
Refer to <a href="../../../../../org/apache/ignite/compute/ComputeTask.html" title="interface in org.apache.ignite.compute"><code>ComputeTask</code></a> documentation for more information on how a task
can be split into multiple sub-jobs.
<p>
<h1 class="header">Java Example</h1>
Here is a simple example how to grid-enable a Java method. The method <code>sayIt</code>
with <code>@Gridify</code> annotation will be executed on remote node.
<pre name="code" class="java">
...
&#64;Gridify
public static void sayIt(String arg) {
// Simply print out the argument.
System.out.println(arg);
}
...
</pre>
Here is an example of how to grid-enable a Java method with custom task. The custom task
logic will provide a way to split and aggregate the result. The method <code>sayIt</code> will
be executed on remote node.
<pre name="code" class="java">
public class GridifyHelloWorldTaskExample {
...
&#64;Gridify(taskClass = GridifyHelloWorldTask.class, timeout = 3000)
public static integer sayIt(String arg) {
// Simply print out the argument.
System.out.println(">>> Printing '" + arg + "' on this node from grid-enabled method.");
return arg.length();
}
...
}
</pre>
The custom task will actually take the String passed into <code>sayIt(String)</code> method,
split it into words and execute every word on different remote node.
<pre name="code" class="java">
public class GridifyHelloWorldTask extends GridifyTaskSplitAdapter&lt;Integer&gt; {
&#64;Override public Integer apply(String e) {
return F.outJobs(F.yield(((String)arg.getMethodParameters()[0]).split(" "), new C1&lt;String, Integer&gt;() {
&#64;Override public Integer apply(String e) {
// Note that no recursive cross-cutting will happen here.
return GridifyHelloWorldTaskExample.sayIt(e);
}
}));
}
public Integer reduce(List&lt;ComputeJobResult&gt; results) throws IgniteCheckedException {
return results.size() - 1 + F.sum(F.&lt;Integer&gt;jobResults(results));
}
}
</pre>
<p>
<h1 class="header">Jboss AOP</h1>
The following configuration needs to be applied to enable JBoss byte code
weaving. Note that Ignite is not shipped with JBoss and necessary
libraries will have to be downloaded separately (they come standard
if you have JBoss installed already):
<ul>
<li>
The following JVM configuration must be present:
<ul>
<li><code>-javaagent:[path to jboss-aop-jdk50-4.x.x.jar]</code></li>
<li><code>-Djboss.aop.class.path=[path to ignite.jar]</code></li>
<li><code>-Djboss.aop.exclude=org,com -Djboss.aop.include=org.apache.ignite.examples</code></li>
</ul>
</li>
<li>
The following JARs should be in a classpath:
<ul>
<li><code>javassist-3.x.x.jar</code></li>
<li><code>jboss-aop-jdk50-4.x.x.jar</code></li>
<li><code>jboss-aspect-library-jdk50-4.x.x.jar</code></li>
<li><code>jboss-common-4.x.x.jar</code></li>
<li><code>trove-1.0.2.jar</code></li>
</ul>
</li>
</ul>
<p>
<h1 class="header">AspectJ AOP</h1>
The following configuration needs to be applied to enable AspectJ byte code
weaving.
<ul>
<li>
JVM configuration should include:
<code>-javaagent:${IGNITE_HOME}/libs/aspectjweaver-1.7.2.jar</code>
</li>
<li>
META-INF/aop.xml file should be created and specified on the classpath.
The file should contain Gridify aspects and needed weaver options.
</li>
</ul>
<p>
<h1 class="header">Spring AOP</h1>
Spring AOP framework is based on dynamic proxy implementation and doesn't require
any specific runtime parameters for online weaving.
<p>
Note that this method of weaving is rather inconvenient and AspectJ or JBoss AOP is
recommended over it. Spring AOP can be used in situation when code augmentation is
undesired and cannot be used. It also allows for very fine grained control of what gets
weaved.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== ANNOTATION TYPE OPTIONAL MEMBER SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="annotation.type.optional.element.summary">
<!-- -->
</a>
<h3>Optional Element Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Optional Element Summary table, listing optional elements, and an explanation">
<caption><span>Optional Elements</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Optional Element and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#gridName--">gridName</a></span></code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
<div class="block"><span class="deprecationComment">Use <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#igniteInstanceName--"><code>igniteInstanceName()</code></a>. Nonempty <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#igniteInstanceName--"><code>igniteInstanceName()</code></a> takes precedence.</span></div>
</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#igniteInstanceName--">igniteInstanceName</a></span></code>
<div class="block">Name of the Ignite instance to use.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><span class='angle_bracket'>&lt;</span>? extends <a href="../../../../../org/apache/ignite/compute/gridify/GridifyInterceptor.html" title="interface in org.apache.ignite.compute.gridify">GridifyInterceptor</a><span class='angle_bracket'>&gt;</span></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#interceptor--">interceptor</a></span></code>
<div class="block">Optional interceptor class.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><span class='angle_bracket'>&lt;</span>? extends <a href="../../../../../org/apache/ignite/compute/ComputeTask.html" title="interface in org.apache.ignite.compute">ComputeTask</a><span class='angle_bracket'>&lt;</span><a href="../../../../../org/apache/ignite/compute/gridify/GridifyArgument.html" title="interface in org.apache.ignite.compute.gridify">GridifyArgument</a>,?<span class='angle_bracket'>&gt;</span><span class='angle_bracket'>&gt;</span></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskClass--">taskClass</a></span></code>
<div class="block">Optional gridify task class.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskName--">taskName</a></span></code>
<div class="block">Optional gridify task name.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>long</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#timeout--">timeout</a></span></code>
<div class="block">Optional gridify task execution timeout.</div>
</td>
</tr>
</table>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ ANNOTATION TYPE MEMBER DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="annotation.type.element.detail">
<!-- -->
</a>
<h3>Element Detail</h3>
<a name="taskName--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>taskName</h4>
<pre>public abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;taskName</pre>
<div class="block">Optional gridify task name. Note that either this name or <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskClass--"><code>taskClass()</code></a> must
be specified - but not both. If neither one is specified tasks' fully qualified name
will be used as a default name.</div>
<dl>
<dt>Default:</dt>
<dd>""</dd>
</dl>
</li>
</ul>
</li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="taskClass--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>taskClass</h4>
<pre>public abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><span class='angle_bracket'>&lt;</span>? extends <a href="../../../../../org/apache/ignite/compute/ComputeTask.html" title="interface in org.apache.ignite.compute">ComputeTask</a><span class='angle_bracket'>&lt;</span><a href="../../../../../org/apache/ignite/compute/gridify/GridifyArgument.html" title="interface in org.apache.ignite.compute.gridify">GridifyArgument</a>,?<span class='angle_bracket'>&gt;</span><span class='angle_bracket'>&gt;</span>&nbsp;taskClass</pre>
<div class="block">Optional gridify task class. Note that either this name or <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#taskName--"><code>taskName()</code></a> must
be specified - but not both. If neither one is specified tasks' fully qualified name
will be used as a default name.</div>
<dl>
<dt>Default:</dt>
<dd>org.apache.ignite.compute.gridify.aop.GridifyDefaultTask.class</dd>
</dl>
</li>
</ul>
</li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="timeout--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>timeout</h4>
<pre>public abstract&nbsp;long&nbsp;timeout</pre>
<div class="block">Optional gridify task execution timeout. Default is <code>0</code>
which indicates that task will not timeout.</div>
<dl>
<dt>Default:</dt>
<dd>0L</dd>
</dl>
</li>
</ul>
</li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="interceptor--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>interceptor</h4>
<pre>public abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><span class='angle_bracket'>&lt;</span>? extends <a href="../../../../../org/apache/ignite/compute/gridify/GridifyInterceptor.html" title="interface in org.apache.ignite.compute.gridify">GridifyInterceptor</a><span class='angle_bracket'>&gt;</span>&nbsp;interceptor</pre>
<div class="block">Optional interceptor class. Since <code>null</code> are not supported the value of
<code>GridifyInterceptor.class</code> acts as a default value.</div>
<dl>
<dt>Default:</dt>
<dd>org.apache.ignite.compute.gridify.GridifyInterceptor.class</dd>
</dl>
</li>
</ul>
</li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="gridName--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>gridName</h4>
<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
public abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;gridName</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#igniteInstanceName--"><code>igniteInstanceName()</code></a>. Nonempty <a href="../../../../../org/apache/ignite/compute/gridify/Gridify.html#igniteInstanceName--"><code>igniteInstanceName()</code></a> takes precedence.</span></div>
<div class="block">Name of the grid to use. By default, no-name default grid is used.
Refer to <a href="../../../../../org/apache/ignite/Ignition.html" title="class in org.apache.ignite"><code>Ignition</code></a> for information about named grids.</div>
<dl>
<dt>Default:</dt>
<dd>""</dd>
</dl>
</li>
</ul>
</li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="igniteInstanceName--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>igniteInstanceName</h4>
<pre>public abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;igniteInstanceName</pre>
<div class="block">Name of the Ignite instance to use. By default, no-name default Ignite instance is used.
Refer to <a href="../../../../../org/apache/ignite/Ignition.html" title="class in org.apache.ignite"><code>Ignition</code></a> for information about named Ignite instances.</div>
<dl>
<dt>Default:</dt>
<dd>""</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="class-use/Gridify.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">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../org/apache/ignite/compute/gridify/GridifyArgument.html" title="interface in org.apache.ignite.compute.gridify"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/ignite/compute/gridify/Gridify.html" target="_top">Frames</a></li>
<li><a href="Gridify.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>Field&nbsp;|&nbsp;</li>
<li>Required&nbsp;|&nbsp;</li>
<li><a href="#annotation.type.optional.element.summary">Optional</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#annotation.type.element.detail">Element</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small><table width="100%" border="0" cellspacing=0 cellpadding=0 style="padding: 5px"> <tr> <td> <table style="padding-left: 0; margin: 0"> <tbody style="padding: 0; margin: 0"> <tr style="padding: 0; margin: 0"> <td> <a target=_blank href="https://ignite.apache.org"><nobr>2020 Copyright &#169; Apache Software Foundation</nobr></a> </td> </tr> </tbody> </table> </td> <td width="100%" align="right" valign="center"> <a href="https://twitter.com/ApacheIgnite" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @ApacheIgnite</a> </td> </tr> <tr> <td colspan="2" valign="top" align="left"> <table style="padding-left: 0; margin: 0"> <tbody style="padding: 0; margin: 0"> <tr style="padding: 0; margin: 0"> <td> <b>Ignite Database and Caching Platform</b> </td> <td>:&nbsp;&nbsp; ver. <strong>2.9.1</strong> </td> </tr> <tr style="padding: 0; margin: 0"> <td> <b>Release Date</b> </td> <td>:&nbsp;&nbsp; December 9 2020 </td> </tr> </tbody> </table> </td> </tr> </table></small></p>
</body>
</html>