コード例 #1
0
        private void OnExecuteJob(object state)
        {
            Task allTask = null;

            try
            {
                Parallel.ForEach(_syncJobTypes, jobType =>
                {
                    IBackgroundJob job = null;
                    try
                    {
                        using (var scope = _container.CreateScope())
                        {
                            try
                            {
                                job = (IBackgroundJob)scope.Resolve(jobType);
                                ScopeCreated(this, new ScopeCreatedEventArgs(scope));
                                job.Execute();
                                Signal.Reset("ApplicationServices[" + job.GetType() + "].Failed");
                                ScopeClosing(this, new ScopeClosingEventArgs(scope, true));
                            }
                            catch (Exception exception)
                            {
                                Signal.Raise("ApplicationServices[" + jobType.FullName + "].Failed", "Failed to execute job.", exception);
                                var args = new BackgroundJobFailedEventArgs(job ?? new NoJob(jobType, exception), exception);
                                JobFailed(this, args);
                                ScopeClosing(this, new ScopeClosingEventArgs(scope, false)
                                {
                                    Exception = exception
                                });
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        JobFailed(this, new BackgroundJobFailedEventArgs(new NoJob(jobType, exception), exception));
                        _logger.Error("Failed to execute job: " + job, exception);
                    }
                });

                var tasks = _asyncJobTypes.Select(ExecuteAsyncJob);
                allTask = Task.WhenAll(tasks);
                allTask.Wait();
            }
            catch (Exception exception)
            {
                _logger.Error("failed to execute jobs", exception);
                if (allTask != null)
                {
                    JobFailed(this, new BackgroundJobFailedEventArgs(new NoJob(GetType(), allTask.Exception), exception));
                }
                else
                {
                    JobFailed(this, new BackgroundJobFailedEventArgs(new NoJob(GetType(), exception), exception));
                }
            }
        }
コード例 #2
0
 public void SpawnJob(IBackgroundJob job)
 {
     if (job.JobNumber == 0)
       {
     throw new ArgumentException("job");
       }
       IBackgroundJobHandler jobHandler = _jobHandlerLocator.LocateJobHandler(job.GetType());
       IThread thread = _threadManager.CreateThread(new QueuedJob(job, jobHandler));
       thread.Start();
 }
コード例 #3
0
 public IBackgroundJob QueueJob(IBackgroundJob job)
 {
     IJobRepository jobRepository = _jobRepositoryLocator.LocateJobRepository(job.GetType());
       jobRepository.SaveJob(job);
       return job;
 }