问题描述
我有一个长时间的 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}");
}
}
}
问候。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)