async Task Run <T>(ConsumerJobContext <T> jobContext, IJobFactory <T> jobFactory) where T : class { try { IPipe <JobContext <T> > nextPipe = Pipe.ExecuteAsync <JobContext <T> >(async context => { await context.Publish <JobCompleted>(new Completed(context.JobId)).ConfigureAwait(false); }); await jobFactory.Execute(jobContext, nextPipe).ConfigureAwait(false); } catch (TaskCanceledException) { await NotifyCanceled(jobContext).ConfigureAwait(false); } catch (OperationCanceledException) { await NotifyCanceled(jobContext).ConfigureAwait(false); } catch (Exception exception) { JobContext <T> context = jobContext; await context.Publish <JobFaulted <T> >(new Faulted <T>(jobContext.JobId, jobContext.Message, exception)).ConfigureAwait(false); } finally { jobContext.Dispose(); } }
async Task <JobHandle <T> > IJobService.CreateJob <T>(ConsumeContext context, Guid jobId, T command, IJobFactory <T> jobFactory) { if (_stopping) { throw new InvalidOperationException("The job service is stopping."); } var jobContext = new ConsumerJobContext <T>(context, jobId, command); var babyTask = Run(jobContext, jobFactory); var jobHandle = new ConsumerJobHandle <T>(jobContext, babyTask); _registry.Add(jobHandle); await ScheduleSupervision(jobContext, jobContext.Command, jobHandle).ConfigureAwait(false); return(jobHandle); }
async Task <JobHandle <T> > ITurnoutController.CreateJob <T>(ConsumeContext <T> context, IJobFactory <T> jobFactory) { var jobContext = new ConsumerJobContext <T>(context); var babyTask = Run(jobContext, jobFactory); var jobHandle = new ConsumerJobHandle <T>(jobContext, babyTask); _roster.Add(jobContext.JobId, jobHandle); var utcNow = DateTime.UtcNow; var scheduledTime = utcNow + _superviseInterval; var check = new Supervise(jobContext.JobId, utcNow, jobHandle.Status); await context.ScheduleMessage(_controlAddress, scheduledTime, check).ConfigureAwait(false); return(jobHandle); }
async Task Run <T>(ConsumerJobContext <T> jobContext, IJobFactory <T> jobFactory) where T : class { try { IPipe <JobContext <T> > pipe = Pipe.New <JobContext <T> >(cfg => { cfg.UseRetry(r => { r.Ignore <TaskCanceledException>(); r.Ignore <OperationCanceledException>(); r.Interval(1, 1000); }); cfg.UseExecuteAsync(context => context.NotifyStarted(_managementAddress)); cfg.UseInlineFilter(jobFactory.Execute); cfg.UseExecuteAsync(context => context.NotifyCompleted()); }); await pipe.Send(jobContext).ConfigureAwait(false); } catch (TaskCanceledException) { await jobContext.NotifyCanceled("Task canceled").ConfigureAwait(false); } catch (OperationCanceledException) { await jobContext.NotifyCanceled("Operation canceled").ConfigureAwait(false); } catch (Exception exception) { await jobContext.NotifyFaulted(exception).ConfigureAwait(false); } finally { jobContext.Dispose(); } }
async Task Run <T>(ConsumerJobContext <T> jobContext, IJobFactory <T> jobFactory) where T : class { try { var nextPipe = Pipe.ExecuteAsync <JobContext <T> >(async context => { await context.Publish <JobCompleted>(new Completed(context.JobId)).ConfigureAwait(false); }); await jobFactory.Execute(jobContext, nextPipe).ConfigureAwait(false); } catch (Exception exception) { JobContext <T> context = jobContext; await context.Publish <JobFaulted>(new Faulted(jobContext.JobId, exception)).ConfigureAwait(false); } finally { jobContext.Dispose(); } }
public ConsumerJobHandle(ConsumerJobContext <T> jobContext, Task task) { _jobContext = jobContext; _task = task; }
static async Task NotifyCanceled <T>(ConsumerJobContext <T> jobContext) where T : class { JobContext <T> context = jobContext; await context.Publish <JobCanceled <T> >(new Canceled <T>(jobContext.JobId, jobContext.Message)).ConfigureAwait(false); }