Azure webjob,持续时间长

我有一个长时间的 webjob (TimerTrigger) 运行。

它偶尔会失败。

持续 4 到 5 个小时。

当它失败时不会引发异常。

这可能是计划尺寸错误的问题。

有没有办法定义正确的计划?

同样在重新启动webjob时,前一次出现的情况会重新启动,我们希望避免这种情况,只需要重新启动下一次。

环境:Azure WebJob、.netcore (3.1) 堆栈、始终开启、64 位、存储帐户写入、对 web 作业的 autofac 依赖注入。

有什么想法吗?

代码:

        public FeedJob(IFeedConfiguration configuration,IKeyVaultService keyVaultService,IStoragetableService storagetableService,IBlobStorageService blobStorageService)
    {
        _configuration = configuration as FeedConfiguration;
        _keyVaultService = keyVaultService;
        _storagetableService = storagetableService;
        _blobStorageService = blobStorageService;
    }
    /// <summary>
    /// run periodically to request  web service
    /// </summary>
    /// <param name="myTimer"></param>
    /// <param name="log"></param>
    /// <returns></returns>
    public async Task ProcessTimerJob([TimerTrigger("%RunEvery%")] TimerInfo myTimer,ILogger log)
    {
        try
        {
            logJob = log;
            _cptTotal = _cptErrors = _cptNominals = 0;
            _dtStart = DateTime.UtcNow;
            var dtStartForReconstruction = _dtStart.AddHours(-1);

            logJob.LogInformation($"OP- =========== Job -  - =========== Started at : {_dtStart}");

            // certificate necessary to be allowed to request  (soap)
            //var Saurcertificate = X509Helper.getcertificate(_configuration.CertificateThumbprint);
            var Saurcertificate = await _keyVaultService.getcertificateFromKeyVaultByThumbprint(_configuration.CertificateThumbprint);

            var requests = await _blobStorageService.GetRequests(_configuration.InRequest);
            var cl = new List<DataColumn>();


            // parquet data are loaded in memory (about 17500 records)
            cl = await _blobStorageService.GetDataParquet(_dtStart);

            var borneInf = 0;
            var bornesup = cl[2].Data.Length;
            _cptTotal = 0;
            _errors = new Dictionary<string,int>();

            foreach (var req in requests)
            {
                var subEltsXml = req.Descendants().ToList();
                var endPointXml = subEltsXml.FirstOrDefault(e => e.Name == "EndPoint");
                var soapRequestXml = subEltsXml.FirstOrDefault(e => e.Name == "ReqSoap");
                _prefix = subEltsXml.FirstOrDefault(e => e.Name == "Prefix").Value;
                _title = subEltsXml.FirstOrDefault(e => e.Name == "Title").Value;

                DateTime dateFin,dateDeb;

                if (_prefix == "Ccpm")
                {
                    dateDeb = _dtStart;
                    dateFin = _dtStart.AddYears(1).AddDays(-1);
                }
                else
                {
                    //CDC
                    dateFin = _dtStart;
                    dateDeb = _dtStart.AddDays(-1);
                }
                _dayFolder = $"{dateFin:yyyyMMdd}";

                logJob.LogInformation($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Extraction {_title} from  {dateDeb:yyyy-MM-dd} to {dateFin:yyyy-MM-dd}");
                logJob.LogInformation($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Extraction {_title} from pdl {borneInf} to pdl {bornesup - 1}");

                if (endPointXml != null && soapRequestXml != null)
                {
                    _cptTotalReq = _cptErrorsReq = _cptNominalsReq = 0;

                    for (int i = borneInf; i < bornesup; i++)
                    {
                        _cptTotalReq++;

                        var pdl = ((string[])cl[2].Data)[i];
                        var tarif = ((string[])cl[0].Data)[i];

                        var res = SetRequest(req,pdl,tarif,dateDeb,dateFin);

                        if (res.Item2)
                        {

                            var req2 = res.Item1;

                            var client = new RestClient(endPointXml.Value);
                            client.ClientCertificates = new X509CertificateCollection() { Saurcertificate };
                            client.Timeout = -1;

                            var request = new RestRequest(Method.POST);
                            request.AddHeader("Content-Type","application/xml");
                            request.AddParameter("application/xml",req2.Descendants().ToList().FirstOrDefault().ToString(),ParameterType.RequestBody);

                            var response = await client.ExecuteAsync(request);

                            await WriteResultAsync(pdl,endPointXml.Value,response.Content,req2.Descendants().ToList().FirstOrDefault().ToString());
                        }

                        if (_cptTotalReq % 3000 == 0)
                        {
                            logJob.LogInformation($"OP- {_prefix} {DateTime.UtcNow} =========== Job -  - =========== {_cptTotalReq} / {bornesup - borneInf} pdls treated ");
                        }
                    }


                    _cptTotal += _cptTotalReq;
                    _cptNominals += _cptNominalsReq;
                    _cptErrors += _cptErrorsReq;
                }
            }


            await _storagetableService.WriteReport(new ReportRecord
            {
                PartitionKey = $"{_dtStart:yyyy-MM-dd-HH-mm-ss-fff}",RowKey = _prefix,DayFolder = _dayFolder,PdlsRetrieved = _cptTotalReq,PdlsTreated = _cptNominalsReq + _cptErrorsReq,PdlsTreatedOK = _cptNominalsReq,PdlsTreatedKO = _cptErrorsReq,PdlsnotTreated = _cptTotalReq - _cptNominalsReq - _cptErrorsReq,StatusesErrorXML = statusesErrorXML.ToString(),TariffsnotTreatedXML = tariffsnotTreatedXML.ToString()
            });

            logJob.LogInformation($@"OP- {DateTime.UtcNow}  Job -  - ================================== Total all extractions ==================================");
            logJob.LogInformation($@"OP- {DateTime.UtcNow}  Job -  - =========== Total pdls treated : {_cptTotal}");
            logJob.LogInformation($@"OP- {DateTime.UtcNow}  Job -  - =========== Total pdls OK : {_cptNominals}");
            logJob.LogInformation($@"OP- {DateTime.UtcNow}  Job -  - =========== Total pdls KO : {_cptErrors}");

            logJob.LogInformation($@"OP- {_dtStart}  Job -  - =========== Ended at : {DateTime.UtcNow}");

        }
        catch (Exception e)
        {
            logJob.LogInformation($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Exception generale at : {DateTime.UtcNow}");
            if (e.InnerException != null)
            {
                logJob.LogError($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Exception generale Message : {e.Message}");
                logJob.LogError($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Exception generale Inner Message : {e.InnerException.Message}");
            }
            else
            {
                logJob.LogError($@"OP- {_prefix} {_dtStart} =========== Job -  - =========== Exception generale Message : {e.Message}");
            }
        }
    }

问候。

lxg1201 回答:Azure webjob,持续时间长

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/336719.html

大家都在问