示例#1
0
        private void TryProcessJob(BackgroundJobInfo jobInfo)
        {
            try
            {
                jobInfo.TryCount++;
                jobInfo.LastTryTime = Clock.Now;

                var jobType = Type.GetType(jobInfo.JobType);
                var job     = _serviceProvider.GetService(jobType);
                try
                {
                    var jobExecuteMethod = job.GetType().GetTypeInfo().GetMethod("Execute");
                    var argsType         = jobExecuteMethod.GetParameters()[0].ParameterType;
//                    var argsObj = _serializer.Deserialize(jobInfo.JobArgs, argsType);
                    var argsObj = JsonConvert.DeserializeObject(jobInfo.JobArgs, argsType);

                    jobExecuteMethod.Invoke(job, new[] { argsObj });

                    AsyncHelper.RunSync(() => _store.DeleteAsync(jobInfo));
                }
                catch (Exception ex)
                {
                    _logger.LogWarning(ex.Message, ex);

                    var nextTryTime = jobInfo.CalculateNextTryTime();
                    if (nextTryTime.HasValue)
                    {
                        jobInfo.NextTryTime = nextTryTime.Value;
                    }
                    else
                    {
                        jobInfo.IsAbandoned = true;
                    }

                    TryUpdate(jobInfo);

                    _eventBus.Publish(
                        new HandleEventException(
                            new BackgroundJobException(
                                "A background job execution is failed. See inner exception for details. See BackgroundJob property to get information on the background job.",
                                ex
                                )
                    {
                        BackgroundJob = jobInfo,
                        JobObject     = job
                    }));
                }
            }
            catch (Exception ex)
            {
                _logger.LogWarning(ex.ToString(), ex);

                jobInfo.IsAbandoned = true;

                TryUpdate(jobInfo);
            }
        }