createDoneCallback = function( jobId ) {
    return function( err, result ) {
      if( self.drop_user_callbacks ) {
        //console.warn( 'Worker started to shutdown, ignoring execution of done callback' );
        //job.log( 'Worker started to shutdown, ignoring execution of done callback' );
        return;
      }
      /*
      if no job in hand, or the current job in hand
      doesn't match called done callback's jobId
      then ignore running callers done.
       */
      if( self.job === null || self.job && self.job.id && self.job.id !== jobId ) {
        //console.warn( 'This job has already been finished, ignoring execution of done callback' );
        //job.log( 'This job has already been finished, ignoring execution of done callback' );
        return;
      }
      if( err ) {
        return self.failed(job, err, fn);
      }
      job.set('duration', job.duration = new Date - start);
      if( result ) {
        try {
          job.result = result;
          job.set('result', JSON.stringify(result), noop);
        } catch(e) {
          job.set('result', JSON.stringify({ error: true, message: 'Invalid JSON Result: "' + result + '"' }), noop);
        }
      }
      job.complete(function() {
        job.attempt(function() {
          if( job.removeOnComplete() ) {
            job.remove();
          }
          self.emitJobEvent('complete', job, result);
          self.start(fn);
        });
      }.bind(this));
    };
  }
Process `job`, marking it as active,
invoking the given callback `fn(job)`,
if the job fails `Worker#failed()` is invoked,
otherwise the job is marked as "complete".

@param {Job} job
@param {Function} fn
@return {Worker} for chaining
@api public