首页 > 解决方案 > ASP.NET Boilerplate 后台作业被放弃

问题描述

我正在使用 asp.net 样板并运行将数据发布到外部 API 的后台作业。该帖子正在正确发生,但后台作业仍被放弃,而不是从 backgroundjobs 表中删除它。

有没有办法强制执行成功的作业,只有在失败时才放弃它。

下面的代码

using Abp.Reflection.Extensions;
using EErx.Middleware.RestAPIClient.Dto;
using Erx.Middleware.Configuration;
using Erx.Middleware.Models;
using Erx.Middleware.RestAPIClient.Dto;
using Erx.Middleware.TCPCommunicator.Models;
using Microsoft.Extensions.Configuration;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text;

namespace Erx.Middleware.TCPCommunicator.Jobs
{
    public class PDStatusUpdateJob : BackgroundJob<PDUpdateJobArgs>, ITransientDependency
    {
        private readonly Log _log;
        private readonly IConfigurationRoot _appConfiguration;
        private readonly IRepository<DispenseMessageHeader, long> _dispenseMessageHeaderRepository;
        private readonly IRepository<DispenseMessageScript, long> _dispenseMessageScriptRepository;
        private readonly IObjectMapper _objectMapper;

        public PDStatusUpdateJob(
            Log log,
            IRepository<DispenseMessageHeader, long> dispenseMessageHeaderRepository,
            IRepository<DispenseMessageScript, long> dispenseMessageScriptRepository,
            IObjectMapper objectMapper
            )
        {
            _log = log;          
            _dispenseMessageHeaderRepository = dispenseMessageHeaderRepository;
            _dispenseMessageScriptRepository = dispenseMessageScriptRepository;
            _objectMapper = objectMapper;
            _appConfiguration = AppConfigurations.Get(
              typeof(TcpCommunicatorModule).GetAssembly().GetDirectoryPathOrNull()
          );
        }

        [UnitOfWork]
        public override void Execute(PDUpdateJobArgs args)
        {
            try
            {
                var output = new PDDispenseMessageDto();
                var scriptOutput = new List<PDDispenseMessageScriptDto>();

                var headerRecord = _dispenseMessageHeaderRepository.FirstOrDefault(x => x.MessageGuid == args.MessageGuid);

                var dispenseMessage = _objectMapper.Map(headerRecord, output);

                var scripts = _dispenseMessageScriptRepository.GetAllIncluding(p => p.Items).Where(x => x.DispenseMessageHeaderId == headerRecord.Id).ToList();

                dispenseMessage.Scripts = _objectMapper.Map(scripts, scriptOutput);

                var request = new RestRequest(Method.POST);

                var requestMsg = dispenseMessage.ToJsonString(true);

                var client = new RestClient(_appConfiguration.GetValue<string>("PDUpdateAPI"))
                {
                    Timeout = -1,
                    RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
                };

                request.AddHeader("Authorization", "Basic " + GenerateToken());
                request.AddHeader("EntityDescription", "ERX");
                request.AddHeader("Content-Type", "application/json");
                request.AddParameter("application/json; charset=utf-8", requestMsg, ParameterType.RequestBody);

                IRestResponse response = client.Execute(request);

                if (response.ErrorMessage != null)
                {
                    _log.Logger.Error(response.ErrorMessage);
                }
               

            }
            catch (Exception e)
            {
                _log.Logger.Error(e.Message);
            }


        }

        public static string GenerateToken()
        {
            var encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes("somestring"));
            return encoded;
        }
    }
}

标签: aspnetboilerplate

解决方案


推荐阅读