blob: b61d01c8e654080ececc6fb6ffaad5a855b23397 [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>
<META NAME="ROBOTS" CONTENT="NOINDEX">
<link rel="canonical" href="https://ignite.apache.org/releases/1.0.0-rc3/javadoc/org/apache/ignite/cache/affinity/CacheAffinityKeyMapped.html" />
<!-- Generated by javadoc (version 1.7.0_21) on Tue Mar 24 10:27:31 MSK 2015 -->
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<title>CacheAffinityKeyMapped (Ignite 1.0.0-RC3)</title>
<meta name="date" content="2015-03-24">
<link rel="stylesheet" type="text/css" href="../../../../../javadoc.css" title="Style">
<link rel='shortcut icon' href='http://gridgain.com/wp-content/uploads/2014/09/favicon.ico'/>
<link type='text/css' rel='stylesheet' href='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css'/>
<link type='text/css' rel='stylesheet' href='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css'/>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shCore.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shLegacy.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushJava.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushPlain.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushJScript.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushBash.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushXml.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushScala.js'></script>
<script type='text/javascript' src='http://gridgain.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushGroovy.js'></script>
<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"><!--
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="CacheAffinityKeyMapped (Ignite 1.0.0-RC3)";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar_top">
<!-- -->
</a><a href="#skip-navbar_top" title="Skip navigation links"></a><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/CacheAffinityKeyMapped.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 class="aboutLanguage"><em>Apache Ignite - In-Memory Data Fabric</em></div>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKey.html" title="class in org.apache.ignite.cache.affinity"><span class="strong">Prev Class</span></a></li>
<li><a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKeyMapper.html" title="interface in org.apache.ignite.cache.affinity"><span class="strong">Next Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/ignite/cache/affinity/CacheAffinityKeyMapped.html" target="_top">Frames</a></li>
<li><a href="CacheAffinityKeyMapped.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses-noframe.html">All 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>Required&nbsp;|&nbsp;</li>
<li>Optional</li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Element</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.cache.affinity</div>
<h2 title="Annotation Type CacheAffinityKeyMapped" class="title">Annotation Type CacheAffinityKeyMapped</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Documented.html?is-external=true" title="class or interface in java.lang.annotation">@Documented</a>
<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Retention.html?is-external=true" title="class or interface in java.lang.annotation">@Retention</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Retention.html?is-external=true#value()" title="class or interface in java.lang.annotation">value</a>=<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicy.html?is-external=true#RUNTIME" title="class or interface in java.lang.annotation">RUNTIME</a>)
<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Target.html?is-external=true" title="class or interface in java.lang.annotation">@Target</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Target.html?is-external=true#value()" title="class or interface in java.lang.annotation">value</a>={<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/ElementType.html?is-external=true#FIELD" title="class or interface in java.lang.annotation">FIELD</a>,<a href="http://docs.oracle.com/javase/7/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="strong">CacheAffinityKeyMapped</span></pre>
<div class="block">Optional annotation to specify custom key-to-node affinity. Affinity key is a key
which will be used to determine a node on which given cache key will be stored. This
annotation allows to mark a field or a method in the cache key object that will be
used as an affinity key (instead of the entire cache key object that is used for
affinity by default). Note that a class can have only one field or method annotated
with <code>@CacheAffinityKeyMapped</code> annotation.
<p>
One of the major use cases for this annotation is the routing of grid computations
to the nodes where the data for this computation is cached, the concept
otherwise known as <code>Collocation Of Computations And Data</code>.
<p>
<h1 class="header">Mapping Cache Keys</h1>
The default implementation of <a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKeyMapper.html" title="interface in org.apache.ignite.cache.affinity"><code>CacheAffinityKeyMapper</code></a>, which will be used
if no explicit affinity mapper is specified in cache configuration, will first look
for any field or method annotated with <code>@CacheAffinityKeyMapped</code> annotation.
If such field or method is not found, then the cache key itself will be used for
key-to-node affinity (this means that all objects with the same cache key will always
be routed to the same node). If such field or method is found, then the value of this
field or method will be used for key-to-node affinity. This allows to specify alternate
affinity key, other than the cache key itself, whenever needed.
<p>
For example, if a <code>Person</code> object is always accessed together with a <code>Company</code> object
for which this person is an employee, then for better performance and scalability it makes sense to
collocate <code>Person</code> objects together with their <code>Company</code> object when storing them in
cache. To achieve that, cache key used to cache <code>Person</code> objects should have a field or method
annotated with <code>@CacheAffinityKeyMapped</code> annotation, which will provide the value of
the company key for which that person works, like so:
<pre name="code" class="java">
public class PersonKey {
// Person ID used to identify a person.
private String personId;
// Company ID which will be used for affinity.
&#64;CacheAffinityKeyMapped
private String companyId;
...
}
...
// Instantiate person keys.
Object personKey1 = new PersonKey("myPersonId1", "myCompanyId");
Object personKey2 = new PersonKey("myPersonId2", "myCompanyId");
// Both, the company and the person objects will be cached on the same node.
cache.put("myCompanyId", new Company(..));
cache.put(personKey1, new Person(..));
cache.put(personKey2, new Person(..));
</pre>
<p>
<h2 class="header">CacheAffinityKey</h2>
For convenience, you can also optionally use <a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKey.html" title="class in org.apache.ignite.cache.affinity"><code>CacheAffinityKey</code></a> class. Here is how a
<code>PersonKey</code> defined above would look using <a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKey.html" title="class in org.apache.ignite.cache.affinity"><code>CacheAffinityKey</code></a>:
<pre name="code" class="java">
Object personKey1 = new CacheAffinityKey("myPersonId1", "myCompanyId");
Object personKey2 = new CacheAffinityKey("myPersonId2", "myCompanyId");
// Both, the company and the person objects will be cached on the same node.
cache.put(myCompanyId, new Company(..));
cache.put(personKey1, new Person(..));
cache.put(personKey2, new Person(..));
</pre>
<p>
<h1 class="header">Collocating Computations And Data</h1>
It is also possible to route computations to the nodes where the data is cached. This concept
is otherwise known as <code>Collocation Of Computations And Data</code>. In this case,
<code>@CacheAffinityKeyMapped</code> annotation allows to specify a routing affinity key for a
<a href="../../../../../org/apache/ignite/compute/ComputeJob.html" title="interface in org.apache.ignite.compute"><code>ComputeJob</code></a> or any other grid computation, such as <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang"><code>Runnable</code></a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent"><code>Callable</code></a>, or
<a href="../../../../../org/apache/ignite/lang/IgniteClosure.html" title="interface in org.apache.ignite.lang"><code>IgniteClosure</code></a>. It should be attached to a method or field that provides affinity key
for the computation. Only one annotation per class is allowed. Whenever such annotation is detected,
then <a href="../../../../../org/apache/ignite/spi/loadbalancing/LoadBalancingSpi.html" title="interface in org.apache.ignite.spi.loadbalancing"><code>LoadBalancingSpi</code></a> will be bypassed, and computation will be routed to the grid node
where the specified affinity key is cached. You can also use optional <code>@CacheName</code>
annotation whenever non-default cache name needs to be specified.
<p>
Here is how this annotation can be used to route a job to a node where Person object
is cached with ID "1234":
<pre name="code" class="java">
G.grid().run(new Runnable() {
// This annotation is optional. If omitted, then default
// no-name cache will be used.
&#64;CacheName
private String cacheName = "myCache";
// This annotation specifies that computation should be routed
// precisely to the node where key '1234' is cached.
&#64;CacheAffinityKeyMapped
private String personKey = "1234";
&#64;Override public void run() {
// Some computation logic here.
...
}
};
</pre>
The same can be achieved by annotating method instead of field as follows:
<pre name="code" class="java">
G.grid().run(new Runnable() {
&#64;Override public void run() {
// Some computation logic here.
...
}
// This annotation is optional. If omitted, then default
// no-name cache will be used.
&#64;CacheName
public String cacheName() {
return "myCache";
}
// This annotation specifies that computation should be routed
// precisely to the node where key '1234' is cached.
&#64;CacheAffinityKeyMapped
public String personKey() {
return "1234";
}
};
</pre>
<p>
For more information about cache affinity also see <a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKeyMapper.html" title="interface in org.apache.ignite.cache.affinity"><code>CacheAffinityKeyMapper</code></a> and
<a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityFunction.html" title="interface in org.apache.ignite.cache.affinity"><code>CacheAffinityFunction</code></a> documentation.
Affinity for a key can be found from any node, regardless of whether it has cache started
or not. If cache is not started, affinity function will be fetched from the remote node
which does have the cache running.</div>
<dl><dt><span class="strong">See Also:</span></dt><dd><code>org.apache.ignite.cache.CacheName</code>,
<a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityFunction.html" title="interface in org.apache.ignite.cache.affinity"><code>CacheAffinityFunction</code></a>,
<a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKeyMapper.html" title="interface in org.apache.ignite.cache.affinity"><code>CacheAffinityKeyMapper</code></a>,
<a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKey.html" title="class in org.apache.ignite.cache.affinity"><code>CacheAffinityKey</code></a></dd></dl>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar_bottom">
<!-- -->
</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><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/CacheAffinityKeyMapped.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 class="aboutLanguage"><em>Apache Ignite - In-Memory Data Fabric</em></div>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKey.html" title="class in org.apache.ignite.cache.affinity"><span class="strong">Prev Class</span></a></li>
<li><a href="../../../../../org/apache/ignite/cache/affinity/CacheAffinityKeyMapper.html" title="interface in org.apache.ignite.cache.affinity"><span class="strong">Next Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/ignite/cache/affinity/CacheAffinityKeyMapped.html" target="_top">Frames</a></li>
<li><a href="CacheAffinityKeyMapped.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses-noframe.html">All 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>Required&nbsp;|&nbsp;</li>
<li>Optional</li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Element</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://incubator.apache.org/projects/ignite.html"><nobr>2015 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> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> </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>Apache Ignite Fabric</b> </td> <td>:&nbsp;&nbsp; ver. <strong>1.0.0-RC3</strong> </td> </tr> <tr style="padding: 0; margin: 0"> <td> <b>Release Date</b> </td> <td>:&nbsp;&nbsp; March 24 2015 </td> </tr> </tbody> </table> </td> </tr> </table></small></p>
<!--FOOTER--><script type='text/javascript'>SyntaxHighlighter.all();dp.SyntaxHighlighter.HighlightAll('code');</script>
</body>
</html>