blob: af3315d1ec94f565e9817f0766b44f27c10d3438 [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/compute/ComputeJob.html" />
<!-- Generated by javadoc (version 1.7.0_21) on Tue Mar 24 10:27:32 MSK 2015 -->
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<title>ComputeJob (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="ComputeJob (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/ComputeJob.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/compute/ComputeExecutionRejectedException.html" title="class in org.apache.ignite.compute"><span class="strong">Prev Class</span></a></li>
<li><a href="../../../../org/apache/ignite/compute/ComputeJobAdapter.html" title="class in org.apache.ignite.compute"><span class="strong">Next Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?org/apache/ignite/compute/ComputeJob.html" target="_top">Frames</a></li>
<li><a href="ComputeJob.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>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">org.apache.ignite.compute</div>
<h2 title="Interface ComputeJob" class="title">Interface ComputeJob</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Superinterfaces:</dt>
<dd><a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><a href="../../../../org/apache/ignite/compute/ComputeJobAdapter.html" title="class in org.apache.ignite.compute">ComputeJobAdapter</a>, <a href="../../../../org/apache/ignite/compute/ComputeJobContinuationAdapter.html" title="class in org.apache.ignite.compute">ComputeJobContinuationAdapter</a></dd>
</dl>
<hr>
<br>
<pre>public interface <span class="strong">ComputeJob</span>
extends <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></pre>
<div class="block">Defines executable unit for <a href="../../../../org/apache/ignite/compute/ComputeTask.html" title="interface in org.apache.ignite.compute"><code>ComputeTask</code></a>.
<h1 class="header">Description</h1>
Grid job is an executable unit of <a href="../../../../org/apache/ignite/compute/ComputeTask.html" title="interface in org.apache.ignite.compute"><code>ComputeTask</code></a>. Grid task gets split into jobs
when <a href="../../../../org/apache/ignite/compute/ComputeTask.html#map(java.util.List, T)"><code>ComputeTask.map(List, Object)</code></a> method is called. This method returns
all jobs for the task mapped to their corresponding grid nodes for execution. Grid
will then serialize this jobs and send them to requested nodes for execution.
When a node receives a request to execute a job, the following sequence of events
takes place:
<ol>
<li>
If collision SPI is defined, then job gets put on waiting list which is passed to underlying
<a href="../../../../org/apache/ignite/spi/collision/CollisionSpi.html" title="interface in org.apache.ignite.spi.collision"><code>CollisionSpi</code></a> SPI. Otherwise job will be submitted to the executor
service responsible for job execution immediately upon arrival.
</li>
<li>
If collision SPI is configured, then it will decide one of the following scheduling policies:
<ul>
<li>
Job will be kept on waiting list. In this case, job will not get a
chance to execute until next time the Collision SPI is called.
</li>
<li>
Job will be moved to active list. In this case system will proceed
with job execution.
</li>
<li>
Job will be rejected. In this case the <a href="../../../../org/apache/ignite/compute/ComputeJobResult.html" title="interface in org.apache.ignite.compute"><code>ComputeJobResult</code></a> passed into
<a href="../../../../org/apache/ignite/compute/ComputeTask.html#result(org.apache.ignite.compute.ComputeJobResult, java.util.List)"><code>ComputeTask.result(ComputeJobResult, List)</code></a> method will contain
<a href="../../../../org/apache/ignite/compute/ComputeExecutionRejectedException.html" title="class in org.apache.ignite.compute"><code>ComputeExecutionRejectedException</code></a> exception. If you are using any
of the task adapters shipped with Ignite, then job will be failed
over automatically for execution on another node.
</li>
</ul>
</li>
<li>
For activated jobs, an instance of distributed task session (see <a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html" title="interface in org.apache.ignite.compute"><code>ComputeTaskSession</code></a>)
will be injected.
</li>
<li>
System will execute the job by calling <a href="../../../../org/apache/ignite/compute/ComputeJob.html#execute()"><code>execute()</code></a> method.
</li>
<li>
If job gets cancelled while executing then <a href="../../../../org/apache/ignite/compute/ComputeJob.html#cancel()"><code>cancel()</code></a>
method will be called. Note that just like with <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?is-external=true#interrupt()" title="class or interface in java.lang"><code>Thread.interrupt()</code></a>
method, grid job cancellation serves as a hint that a job should stop
executing or exhibit some other user defined behavior. Generally it is
up to a job to decide whether it wants to react to cancellation or
ignore it. Job cancellation can happen for several reasons:
<ul>
<li>Collision SPI cancelled an active job.</li>
<li>Parent task has completed without waiting for this job's result.</li>
<li>User cancelled task by calling <a href="../../../../org/apache/ignite/lang/IgniteFuture.html#cancel()"><code>IgniteFuture.cancel()</code></a> method.</li>
</ul>
</li>
<li>
Once job execution is complete, the return value will be sent back to parent
task and will be passed into <a href="../../../../org/apache/ignite/compute/ComputeTask.html#result(org.apache.ignite.compute.ComputeJobResult, java.util.List)"><code>ComputeTask.result(ComputeJobResult, List)</code></a>
method via <a href="../../../../org/apache/ignite/compute/ComputeJobResult.html" title="interface in org.apache.ignite.compute"><code>ComputeJobResult</code></a> instance. If job execution resulted
in a checked exception, then <a href="../../../../org/apache/ignite/compute/ComputeJobResult.html#getException()"><code>ComputeJobResult.getException()</code></a> method
will contain that exception. If job execution threw a runtime exception
or error, then it will be wrapped into <a href="../../../../org/apache/ignite/compute/ComputeUserUndeclaredException.html" title="class in org.apache.ignite.compute"><code>ComputeUserUndeclaredException</code></a>
exception.
</li>
</ol>
<p>
<h1 class="header">Resource Injection</h1>
Grid job implementation can be injected using IoC (dependency injection) with
ignite resources. Both, field and method based injection are supported.
The following ignite resources can be injected:
<ul>
<li><a href="../../../../org/apache/ignite/resources/TaskSessionResource.html" title="annotation in org.apache.ignite.resources"><code>TaskSessionResource</code></a></li>
<li><a href="../../../../org/apache/ignite/resources/JobContextResource.html" title="annotation in org.apache.ignite.resources"><code>JobContextResource</code></a></li>
<li><a href="../../../../org/apache/ignite/resources/IgniteInstanceResource.html" title="annotation in org.apache.ignite.resources"><code>IgniteInstanceResource</code></a></li>
<li><a href="../../../../org/apache/ignite/resources/LoggerResource.html" title="annotation in org.apache.ignite.resources"><code>LoggerResource</code></a></li>
<li><a href="../../../../org/apache/ignite/resources/SpringApplicationContextResource.html" title="annotation in org.apache.ignite.resources"><code>SpringApplicationContextResource</code></a></li>
<li><a href="../../../../org/apache/ignite/resources/SpringResource.html" title="annotation in org.apache.ignite.resources"><code>SpringResource</code></a></li>
</ul>
Refer to corresponding resource documentation for more information.
<p>
<h1 class="header">GridComputeJobAdapter</h1>
Ignite comes with convenience <a href="../../../../org/apache/ignite/compute/ComputeJobAdapter.html" title="class in org.apache.ignite.compute"><code>ComputeJobAdapter</code></a> adapter that provides
default empty implementation for <a href="../../../../org/apache/ignite/compute/ComputeJob.html#cancel()"><code>cancel()</code></a> method and also
allows user to set and get job argument, if there is one.
<p>
<h1 class="header">Distributed Session Attributes</h1>
Jobs can communicate with parent task and with other job siblings from the same
task by setting session attributes (see <a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html" title="interface in org.apache.ignite.compute"><code>ComputeTaskSession</code></a>). Other jobs
can wait for an attribute to be set either synchronously or asynchronously.
Such functionality allows jobs to synchronize their execution with other jobs
at any point and can be useful when other jobs within task need to be made aware
of certain event or state change that occurred during job execution.
<p>
Distributed task session can be injected into <a href="../../../../org/apache/ignite/compute/ComputeJob.html" title="interface in org.apache.ignite.compute"><code>ComputeJob</code></a> implementation
using <a href="../../../../org/apache/ignite/resources/TaskSessionResource.html" title="annotation in org.apache.ignite.resources"><code>@TaskSessionResource</code></a> annotation.
Both, field and method based injections are supported. Refer to
<a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html" title="interface in org.apache.ignite.compute"><code>ComputeTaskSession</code></a> documentation for more information on session functionality.
<p>
<h1 class="header">Saving Checkpoints</h1>
Long running jobs may wish to save intermediate checkpoints to protect themselves
from failures. There are three checkpoint management methods:
<ul>
<li><a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html#saveCheckpoint(java.lang.String, java.lang.Object, org.apache.ignite.compute.ComputeTaskSessionScope, long)"><code>ComputeTaskSession.saveCheckpoint(String, Object, ComputeTaskSessionScope, long)</code></a></li>
<li><a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html#loadCheckpoint(java.lang.String)"><code>ComputeTaskSession.loadCheckpoint(String)</code></a></li>
<li><a href="../../../../org/apache/ignite/compute/ComputeTaskSession.html#removeCheckpoint(java.lang.String)"><code>ComputeTaskSession.removeCheckpoint(String)</code></a></li>
</ul>
Jobs that utilize checkpoint functionality should attempt to load a check
point at the beginning of execution. If a <code>non-null</code> value is returned,
then job can continue from where it failed last time, otherwise it would start
from scratch. Throughout it's execution job should periodically save its
intermediate state to avoid starting from scratch in case of a failure.</div>
</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="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><strong><a href="../../../../org/apache/ignite/compute/ComputeJob.html#cancel()">cancel</a></strong>()</code>
<div class="block">This method is called when system detects that completion of this
job can no longer alter the overall outcome (for example, when parent task
has already reduced the results).</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></td>
<td class="colLast"><code><strong><a href="../../../../org/apache/ignite/compute/ComputeJob.html#execute()">execute</a></strong>()</code>
<div class="block">Executes this job.</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="cancel()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>cancel</h4>
<pre>void&nbsp;cancel()</pre>
<div class="block">This method is called when system detects that completion of this
job can no longer alter the overall outcome (for example, when parent task
has already reduced the results). Job is also cancelled when
<a href="../../../../org/apache/ignite/lang/IgniteFuture.html#cancel()"><code>IgniteFuture.cancel()</code></a> is called.
<p>
Note that job cancellation is only a hint, and just like with
<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?is-external=true#interrupt()" title="class or interface in java.lang"><code>Thread.interrupt()</code></a> method, it is really up to the actual job
instance to gracefully finish execution and exit.</div>
</li>
</ul>
<a name="execute()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>execute</h4>
<pre>@Nullable
<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;execute()
throws <a href="../../../../org/apache/ignite/IgniteException.html" title="class in org.apache.ignite">IgniteException</a></pre>
<div class="block">Executes this job.</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>Job execution result (possibly <code>null</code>). This result will be returned
in <a href="../../../../org/apache/ignite/compute/ComputeJobResult.html#getData()"><code>ComputeJobResult.getData()</code></a> method passed into
<a href="../../../../org/apache/ignite/compute/ComputeTask.html#result(org.apache.ignite.compute.ComputeJobResult, java.util.List)"><code>ComputeTask.result(ComputeJobResult, List)</code></a> task method on caller node.</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code><a href="../../../../org/apache/ignite/IgniteException.html" title="class in org.apache.ignite">IgniteException</a></code> - If job execution caused an exception. This exception will be
returned in <a href="../../../../org/apache/ignite/compute/ComputeJobResult.html#getException()"><code>ComputeJobResult.getException()</code></a> method passed into
<a href="../../../../org/apache/ignite/compute/ComputeTask.html#result(org.apache.ignite.compute.ComputeJobResult, java.util.List)"><code>ComputeTask.result(ComputeJobResult, List)</code></a> task method on caller node.
If execution produces a <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang"><code>RuntimeException</code></a> or <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang"><code>Error</code></a>, then
it will be wrapped into <a href="../../../../org/apache/ignite/IgniteCheckedException.html" title="class in org.apache.ignite"><code>IgniteCheckedException</code></a>.</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><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/ComputeJob.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/compute/ComputeExecutionRejectedException.html" title="class in org.apache.ignite.compute"><span class="strong">Prev Class</span></a></li>
<li><a href="../../../../org/apache/ignite/compute/ComputeJobAdapter.html" title="class in org.apache.ignite.compute"><span class="strong">Next Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?org/apache/ignite/compute/ComputeJob.html" target="_top">Frames</a></li>
<li><a href="ComputeJob.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>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 ======= -->
<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>