/** * Create new FusionTask with an async predecessor. */ public static <S, T> FusionTask<?, T> create(final String name, final Task<S> task, final PromisePropagator<S, T> propagator) { return new FusionTask<S, T>(name, task, propagator); }
private <R> FusionTask(final String desc, final FusionTask<S, R> predecessor, final PromisePropagator<R, T> propagator) { super(desc, TaskType.FUSION.getName()); _asyncTask = predecessor._asyncTask; _predecessorShallowTraceBuilder = predecessor.getShallowTraceBuilder(); _propagator = completing(compose(predecessor._propagator, adaptToAcceptTraceContext(propagator))); }
private void transitionDone(final FusionTraceContext traceContext) { addRelationships(traceContext); transitionPending(); transitionDone(); }
private FusionTask(final String desc, final Task<S> task, final PromisePropagator<S, T> propagator) { super(desc, TaskType.FUSION.getName()); _propagator = completing(adaptToAcceptTraceContext(propagator)); _asyncTask = task; _predecessorShallowTraceBuilder = null; }
final Consumer3<FusionTraceContext, Promise<S>, Settable<T>> propagator) { return (traceContext, src, dest) -> { final SettablePromise<T> settable = FusionTask.this.getSettableDelegate(); if (isPropagationInitiator(traceContext)) { } else if (transitionRun(traceContext.getParent().getTraceBuilder())) { markTaskStarted(); } else { addPotentialRelationships(traceContext, traceContext.getParent().getTraceBuilder()); Promises.propagateResult(settable, dest);
@Override protected Promise<? extends T> run(final Context context) throws Throwable { final SettablePromise<T> result = Promises.settable(); String baseName = getName(); if (_asyncTask == null) { /* There is no async predecessor, run propagation immediately */ FusionTraceContext traceContext = new FusionTraceContext(context, FusionTask.this.getShallowTraceBuilder(), baseName); propagate(traceContext, result); } else { /* There is async predecessor, need to run it first PropagationTask will actually run propagation */ final Task<T> propagationTask = Task.async(baseName, ctx -> { final SettablePromise<T> fusionResult = Promises.settable(); FusionTraceContext traceContext = new FusionTraceContext(ctx, FusionTask.this.getShallowTraceBuilder(), baseName); propagate(traceContext, fusionResult); return fusionResult; }); propagationTask.getShallowTraceBuilder() .setHidden(_shallowTraceBuilder.getHidden()) .setSystemHidden(_shallowTraceBuilder.getSystemHidden()); _shallowTraceBuilder.setName("async fused"); _shallowTraceBuilder.setSystemHidden(true); context.after(_asyncTask).run(propagationTask); context.run(_asyncTask); Promises.propagateResult(propagationTask, result); } return result; } }
private void addRelationships(final FusionTraceContext traceContext) { final ShallowTraceBuilder effectoveShallowTraceBuilder = getEffectiveShallowTraceBuilder(traceContext); TraceBuilder builder = getTraceBuilder(); builder.addRelationship(Relationship.PARENT_OF, traceContext.getParent().getShallowTraceBuilder(), effectoveShallowTraceBuilder); if (_predecessorShallowTraceBuilder != null) { builder.addRelationship(Relationship.SUCCESSOR_OF, effectoveShallowTraceBuilder, _predecessorShallowTraceBuilder); } }
default <R> Task<R> apply(final String desc, final PromisePropagator<T, R> propagator) { return FusionTask.create(desc, this, propagator); }
private void addPotentialRelationships(final FusionTraceContext traceContext, final TraceBuilder builder) { final ShallowTraceBuilder effectoveShallowTraceBuilder = getEffectiveShallowTraceBuilder(traceContext); builder.addRelationship(Relationship.POTENTIAL_CHILD_OF, effectoveShallowTraceBuilder, traceContext.getParent().getShallowTraceBuilder()); if (_predecessorShallowTraceBuilder != null) { builder.addRelationship(Relationship.POSSIBLE_SUCCESSOR_OF, effectoveShallowTraceBuilder, _predecessorShallowTraceBuilder); } }
/** * Has current task initiated propagation? */ private boolean isPropagationInitiator(final FusionTraceContext traceContext) { return traceContext.getPropagationInitiator().getId().equals(getId()); }
final Consumer3<FusionTraceContext, Promise<S>, Settable<T>> propagator) { return (traceContext, src, dest) -> { final SettablePromise<T> settable = FusionTask.this.getSettableDelegate(); if (isPropagationInitiator(traceContext)) { } else if (transitionRun(traceContext.getParent().getTraceBuilder())) { markTaskStarted(); } else { addPotentialRelationships(traceContext, traceContext.getParent().getTraceBuilder()); Promises.propagateResult(settable, dest);
@Override protected Promise<? extends T> run(final Context context) throws Throwable { final SettablePromise<T> result = Promises.settable(); String baseName = getName(); if (_asyncTask == null) { /* There is no async predecessor, run propagation immediately */ FusionTraceContext traceContext = new FusionTraceContext(context, FusionTask.this.getShallowTraceBuilder(), baseName); propagate(traceContext, result); } else { /* There is async predecessor, need to run it first PropagationTask will actually run propagation */ final Task<T> propagationTask = Task.async(baseName, ctx -> { final SettablePromise<T> fusionResult = Promises.settable(); FusionTraceContext traceContext = new FusionTraceContext(ctx, FusionTask.this.getShallowTraceBuilder(), baseName); propagate(traceContext, fusionResult); return fusionResult; }); propagationTask.getShallowTraceBuilder() .setHidden(_shallowTraceBuilder.getHidden()) .setSystemHidden(_shallowTraceBuilder.getSystemHidden()); _shallowTraceBuilder.setName("async fused"); _shallowTraceBuilder.setSystemHidden(true); context.after(_asyncTask).run(propagationTask); context.run(_asyncTask); Promises.propagateResult(propagationTask, result); } return result; } }
private void addRelationships(final FusionTraceContext traceContext) { final ShallowTraceBuilder effectoveShallowTraceBuilder = getEffectiveShallowTraceBuilder(traceContext); TraceBuilder builder = getTraceBuilder(); builder.addRelationship(Relationship.PARENT_OF, traceContext.getParent().getShallowTraceBuilder(), effectoveShallowTraceBuilder); if (_predecessorShallowTraceBuilder != null) { builder.addRelationship(Relationship.SUCCESSOR_OF, effectoveShallowTraceBuilder, _predecessorShallowTraceBuilder); } }
private FusionTask(final String desc, final Task<S> task, final PromisePropagator<S, T> propagator) { super(desc, TaskType.FUSION.getName()); _propagator = completing(adaptToAcceptTraceContext(propagator)); _asyncTask = task; _predecessorShallowTraceBuilder = null; }
/** * Creates a new task that will be resolved with given value when it is * executed. Note that this task is not initially completed. * * @param <T> type of the value * @param desc a description of the value, it will show up in a trace * @param value a value the task will be resolved with * @return new task that will be resolved with given value when it is * executed */ public static <T> Task<T> value(final String desc, final T value) { return FusionTask.create(desc, (src, dst) -> { dst.done(value); } ); }
private void addPotentialRelationships(final FusionTraceContext traceContext, final TraceBuilder builder) { final ShallowTraceBuilder effectoveShallowTraceBuilder = getEffectiveShallowTraceBuilder(traceContext); builder.addRelationship(Relationship.POTENTIAL_CHILD_OF, effectoveShallowTraceBuilder, traceContext.getParent().getShallowTraceBuilder()); if (_predecessorShallowTraceBuilder != null) { builder.addRelationship(Relationship.POSSIBLE_SUCCESSOR_OF, effectoveShallowTraceBuilder, _predecessorShallowTraceBuilder); } }
/** * Has current task initiated propagation? */ private boolean isPropagationInitiator(final FusionTraceContext traceContext) { return traceContext.getPropagationInitiator().getId().equals(getId()); }
private <R> FusionTask(final String desc, final FusionTask<S, R> predecessor, final PromisePropagator<R, T> propagator) { super(desc, TaskType.FUSION.getName()); _asyncTask = predecessor._asyncTask; _predecessorShallowTraceBuilder = predecessor.getShallowTraceBuilder(); _propagator = completing(compose(predecessor._propagator, adaptToAcceptTraceContext(propagator))); }
private void transitionDone(final FusionTraceContext traceContext) { addRelationships(traceContext); transitionPending(); transitionDone(); }
/** * Creates a new task that will be fail with given exception when it is * executed. Note that this task is not initially completed. * * @param <T> type parameter of the returned task * @param desc a description of the failure, it will show up in a trace * @param failure a failure the task will fail with * @return new task that will fail with given failure when it is * executed */ public static <T> Task<T> failure(final String desc, final Throwable failure) { ArgumentUtil.requireNotNull(failure, "failure"); return FusionTask.create(desc, (src, dst) -> { dst.fail(failure); } ); }