<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<title>Trigger</title>
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
    try {
        if (location.href.indexOf('is-external=true') == -1) {
            parent.document.title="Trigger";
        }
    }
    catch(err) {
    }
//-->
var methods = {"i0":6,"i1":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="../../../javax/enterprise/concurrent/SkippedException.html" title="class in javax.enterprise.concurrent"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?javax/enterprise/concurrent/Trigger.html" target="_top">Frames</a></li>
<li><a href="Trigger.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">javax.enterprise.concurrent</div>
<h2 title="Interface Trigger" class="title">Interface Trigger</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public interface <span class="typeNameLabel">Trigger</span></pre>
<div class="block">Triggers allow application developers to plug in rules for when 
 and how often a task should run. The trigger can be as simple as 
 a single, absolute date-time or can include Java&trade; EE business 
 calendar logic. A Trigger implementation is created by the 
 application developer (or may be supplied to the application 
 externally) and is registered with a task when it is submitted 
 to a <a href="../../../javax/enterprise/concurrent/ManagedScheduledExecutorService.html" title="interface in javax.enterprise.concurrent"><code>ManagedScheduledExecutorService</code></a> using any of the 
 schedule methods. Each method will run with unspecified context. 
 The methods can be made contextual through creating contextual
 proxy objects using <a href="../../../javax/enterprise/concurrent/ContextService.html" title="interface in javax.enterprise.concurrent"><code>ContextService</code></a>.
 <p>
 Each Trigger instance will be invoked within the same process 
 in which it was registered.
 <p>
 
 Example:
 <pre>
 &#47;**
  * A trigger that only returns a single date.
  *&#47;
  public class SingleDateTrigger implements Trigger {
      private Date fireTime;
      
      public TriggerSingleDate(Date newDate) {
          fireTime = newDate;
      }

      public Date getNextRunTime(
         LastExecution lastExecutionInfo, Date taskScheduledTime) {
         
         if(taskScheduledTime.after(fireTime)) {
             return null;
         }
         return fireTime;
      }

      public boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) {
          return scheduledRunTime.after(fireTime);
      }
  }

 &#47;**
  * A fixed-rate trigger that will skip any runs if
  * the latencyAllowance threshold is exceeded (the task
  * ran too late).
  *&#47;
  public class TriggerFixedRateLatencySensitive implements Trigger {
      private Date startTime;
      private long delta;
      private long latencyAllowance;

      public TriggerFixedRateLatencySensitive(Date startTime, long delta, long latencyAllowance) {
          this.startTime = startTime;
          this.delta = delta;
          this.latencyAllowance = latencyAllowance;
      }

      public Date getNextRunTime(LastExecution lastExecutionInfo, 
                                 Date taskScheduledTime) {
          if(lastExecutionInfo==null) {
              return startTime;
          }
          return new Date(lastExecutionInfo.getScheduledStart().getTime() + delta);
      }

      public boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) {
          return System.currentTimeMillis() - scheduledRunTime.getTime() > latencyAllowance;
      }
  }

 </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>java.util.Date</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../javax/enterprise/concurrent/Trigger.html#getNextRunTime-javax.enterprise.concurrent.LastExecution-java.util.Date-">getNextRunTime</a></span>(<a href="../../../javax/enterprise/concurrent/LastExecution.html" title="interface in javax.enterprise.concurrent">LastExecution</a>&nbsp;lastExecutionInfo,
              java.util.Date&nbsp;taskScheduledTime)</code>
<div class="block">Retrieve the next time that the task should run after.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../javax/enterprise/concurrent/Trigger.html#skipRun-javax.enterprise.concurrent.LastExecution-java.util.Date-">skipRun</a></span>(<a href="../../../javax/enterprise/concurrent/LastExecution.html" title="interface in javax.enterprise.concurrent">LastExecution</a>&nbsp;lastExecutionInfo,
       java.util.Date&nbsp;scheduledRunTime)</code>
<div class="block">Return true if this run instance should be skipped.</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="getNextRunTime-javax.enterprise.concurrent.LastExecution-java.util.Date-">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getNextRunTime</h4>
<pre>java.util.Date&nbsp;getNextRunTime(<a href="../../../javax/enterprise/concurrent/LastExecution.html" title="interface in javax.enterprise.concurrent">LastExecution</a>&nbsp;lastExecutionInfo,
                              java.util.Date&nbsp;taskScheduledTime)</pre>
<div class="block">Retrieve the next time that the task should run after.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>lastExecutionInfo</code> - information about the last execution of the task. 
                   This value will be null if the task has not yet run.</dd>
<dd><code>taskScheduledTime</code> - the date/time in which the task was scheduled using
                          the <code>ManagedScheduledExecutorService.schedule</code> 
                          method.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the date/time in which the next task iteration should execute on or 
         after.</dd>
</dl>
</li>
</ul>
<a name="skipRun-javax.enterprise.concurrent.LastExecution-java.util.Date-">
<!--   -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>skipRun</h4>
<pre>boolean&nbsp;skipRun(<a href="../../../javax/enterprise/concurrent/LastExecution.html" title="interface in javax.enterprise.concurrent">LastExecution</a>&nbsp;lastExecutionInfo,
                java.util.Date&nbsp;scheduledRunTime)</pre>
<div class="block">Return true if this run instance should be skipped.
 <p>
 This is useful if the task shouldn't run because it is late or if the task 
 is paused or suspended.
 <p>
 Once this task is skipped, the state of it's Future's result will throw a 
 <a href="../../../javax/enterprise/concurrent/SkippedException.html" title="class in javax.enterprise.concurrent"><code>SkippedException</code></a>. Unchecked exceptions will be wrapped in a 
 <code>SkippedException</code>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>lastExecutionInfo</code> - information about the last execution of the task. 
                   This value will be null if the task has not yet run.</dd>
<dd><code>scheduledRunTime</code> - the date/time that the task was originally scheduled 
                         to run.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true if the task should be skipped and rescheduled.</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="../../../javax/enterprise/concurrent/SkippedException.html" title="class in javax.enterprise.concurrent"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?javax/enterprise/concurrent/Trigger.html" target="_top">Frames</a></li>
<li><a href="Trigger.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>
