docs: @Override
      public long startWork(
                            Work work,
                            long startTimeout,
                            ExecutionContext execContext,
                            WorkListener workListener) throws WorkException {
  
          try {
              beforeRunCheck(work, workListener, startTimeout);
  
              WorkProxy workProxy = new WorkProxy(work, startTimeout, execContext, workListener, bootstrapContext, runningWork, true);
  
              FutureTask<Void> futureTask = new FutureTask<Void>(workProxy);
              bootstrapContext.execSvc.executeGlobal(futureTask);
              if (futures.add(futureTask) && futures.size() % FUTURE_PURGE_INTERVAL == 0)
                  purgeFutures();
  
              // It is this call that guarantees that startWork will not return until
              // the work is started or times out.
              Long startupDuration = workProxy.waitForStart();
              if (startupDuration == null) { // didn't start in time
                  futureTask.cancel(true);
                  WorkRejectedException wrex = new WorkRejectedException(Utils.getMessage("J2CA8600.work.start.timeout", work, bootstrapContext.resourceAdapterID,
                                                                                          startTimeout), WorkException.START_TIMED_OUT);
                  if (workListener != null)
                      workListener.workRejected(new WorkEvent(work, WorkEvent.WORK_REJECTED, work, wrex));
                  throw wrex;
              }
  
              if (futureTask.isDone())
                  try {
                      futureTask.get(); // If the work has already failed, cause the failure to be raised here
                  } catch (ExecutionException x) {
                      throw x.getCause();
                  }
  
              return startupDuration;
  
          } catch (WorkException ex) {
              throw ex;
          } catch (Throwable t) {
              WorkRejectedException wrex = new WorkRejectedException(t);
              wrex.setErrorCode(WorkException.INTERNAL);
              if (workListener != null)
                  workListener.workRejected(new WorkEvent(work, WorkEvent.WORK_REJECTED, work, wrex));
              throw wrex;
          }
      }