protected void preExecExertion(Exertion exertion) throws ExertionException {
    try {
      exertion
          .getControlContext()
          .appendTrace(provider.getProviderName() + " dispatcher: " + getClass().getName());

      ExertionSessionInfo.add((ServiceExertion) exertion);
      // Provider is expecting exertion field in Context to be set.
      xrt.getContext().setExertion(xrt);
      updateInputs(exertion);
    } catch (Exception e) {
      throw new ExertionException(e);
    }
    ((ServiceExertion) exertion).startExecTime();
    ((ServiceExertion) exertion).setStatus(RUNNING);
  }
  protected void postExecExertion(Exertion result) throws ExertionException {
    ServiceExertion sxrt = (ServiceExertion) result;
    if (sxrt instanceof NetJob)
      ((NetJob) xrt).setExertionAt(result, ((ServiceExertion) result).getIndex());
    else xrt = sxrt;
    try {
      if (sxrt.getStatus() > ERROR && sxrt.getStatus() != SUSPENDED) {
        sxrt.setStatus(DONE);
        collectOutputs(result);
      }
    } catch (Exception e) {
      throw new ExertionException(e);
    }
    if (sxrt.getStatus() != DONE) state = sxrt.getStatus();

    xrt.stopExecTime();
    dispatchers.remove(xrt.getId());
    ExertionSessionInfo.removeLease();
    dThread.stop = true;
  }