Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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();
            }
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
 public ConsumerJobHandle(ConsumerJobContext <T> jobContext, Task task)
 {
     _jobContext = jobContext;
     _task       = task;
 }
Exemplo n.º 7
0
        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);
        }