@Override public final void contextRun( final Context context, final Task<?> parent, final Collection<Task<?>> predecessors) { final TaskLogger taskLogger = context.getTaskLogger(); final TraceBuilder traceBuilder = context.getTraceBuilder(); if (transitionRun(traceBuilder)) { markTaskStarted(); final Promise<T> promise; try { if (parent != null) { traceBuilder.addRelationship( Relationship.CHILD_OF, getShallowTraceBuilder(), parent.getShallowTraceBuilder()); } for (Task<?> predecessor : predecessors) { traceBuilder.addRelationship( Relationship.SUCCESSOR_OF, getShallowTraceBuilder(), predecessor.getShallowTraceBuilder()); } taskLogger.logTaskStart(this); try { final Context wrapperContext = new WrappedContext(context); promise = doContextRun(wrapperContext); } finally { transitionPending(); } promise.addListener( resolvedPromise -> { if (resolvedPromise.isFailed()) { fail(resolvedPromise.getError(), taskLogger); } else { done(resolvedPromise.get(), taskLogger); } }); } catch (Throwable t) { fail(t, taskLogger); } } else { // this is possible when task was cancelled or has been executed multiple times // e.g. task has multiple paths it can be executed with or has been completed by // a FusionTask if (parent != null) { traceBuilder.addRelationship( Relationship.POTENTIAL_CHILD_OF, getShallowTraceBuilder(), parent.getShallowTraceBuilder()); } for (Task<?> predecessor : predecessors) { traceBuilder.addRelationship( Relationship.POSSIBLE_SUCCESSOR_OF, getShallowTraceBuilder(), predecessor.getShallowTraceBuilder()); } } }
@Override public void onResolved(final Promise<T> promise) { if (_executionReportBuilder != null) { _executionReportBuilder.setParseqTrace(_associatedTask.getTrace()); } RequestExecutionReport executionReport = getRequestExecutionReport(_executionReportBuilder); if (promise.isFailed()) { _callback.onError( promise.getError() instanceof RestLiServiceException ? promise.getError() : new RestLiServiceException( HttpStatus.S_500_INTERNAL_SERVER_ERROR, promise.getError()), executionReport); } else { _callback.onSuccess(promise.get(), executionReport); } }