我有一个定期运行的石英作业,在执行过程中,我会通过HttpClient提交一个rest请求。目前,如果rest“调用”失败(例如,坏请求状态代码400),它将“重新发送”相同的api调用,类似于2-4次。这种行为不是“正确的”,我只想记录rest调用的结果,因为我不希望在最初的触发时间之后执行一个后异步请求。
因此,这基本上是“伪代码”,我只是通过石英作业创建了一堆报告,然后在创建端口失败时发送them.
本身。)
class Job : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var tasks = Enumerable.Range(0, count).Select(index => CreateReport(index));
try
{
await Task.WhenAll(tasks);
}
catch { }
}
public static async Task CreateReport(int index)
{
var response = await ReportApi.PostAsync($"api/createReport/...", null);
}
}发布于 2020-10-08 08:46:33
在这种情况下,理想情况下,您应该对模型进行更多类似于消息传递的建模。您可以拥有单个作业,但是为每个调用作业的报表创建一个触发器,您可以使用"report /user id/ etc“作为参数来触发作业数据映射。这样,一次只有一份报告就会受到问题的影响。
现在,如果您的工作失败,它将被重新尝试在默认情况下。您可以通过在您的逻辑周围有一个try-捕捉来禁止这一点,并且在发生错误时抛出JobExecutionException,它允许您通过它的属性设置逻辑条件,就像允许它停止再次尝试的UnscheduleFiringTrigger一样--但是对于一个一次性触发器,在运行调度器期间,所讨论的触发器将永远不会再次触发。
通常,我建议在外部源(如数据库)中进行状态管理(是否生成了报告)。然后在触发器中检查什么是正确的动作。同样,正如注释中所建议的,重试库可能允许更细粒度的操作。
https://stackoverflow.com/questions/64234263
复制相似问题