首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AsyncTask运行Quartz.net

从AsyncTask运行Quartz.net
EN

Stack Overflow用户
提问于 2020-10-06 21:47:53
回答 1查看 245关注 0票数 0

我有一个定期运行的石英作业,在执行过程中,我会通过HttpClient提交一个rest请求。目前,如果rest“调用”失败(例如,坏请求状态代码400),它将“重新发送”相同的api调用,类似于2-4次。这种行为不是“正确的”,我只想记录rest调用的结果,因为我不希望在最初的触发时间之后执行一个后异步请求。

因此,这基本上是“伪代码”,我只是通过石英作业创建了一堆报告,然后在创建端口失败时发送them.

  • The问题,不知怎么的,请求将被“重新发送”(我在等待之后从createreport函数中登录,并且我看到收到的请求怨恨/响应again)

  • I对此非常陌生,所以我不确定重试机制是否已经进入异步等待或石英本身。

本身。)

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-10-08 08:46:33

在这种情况下,理想情况下,您应该对模型进行更多类似于消息传递的建模。您可以拥有单个作业,但是为每个调用作业的报表创建一个触发器,您可以使用"report /user id/ etc“作为参数来触发作业数据映射。这样,一次只有一份报告就会受到问题的影响。

现在,如果您的工作失败,它将被重新尝试在默认情况下。您可以通过在您的逻辑周围有一个try-捕捉来禁止这一点,并且在发生错误时抛出JobExecutionException,它允许您通过它的属性设置逻辑条件,就像允许它停止再次尝试的UnscheduleFiringTrigger一样--但是对于一个一次性触发器,在运行调度器期间,所讨论的触发器将永远不会再次触发。

通常,我建议在外部源(如数据库)中进行状态管理(是否生成了报告)。然后在触发器中检查什么是正确的动作。同样,正如注释中所建议的,重试库可能允许更细粒度的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64234263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档