C# - 持续检查流程的最佳方式

问题描述 投票:0回答:1

场景:Azure WebJob,它将通过WSDL从NetSuite获取所有供应商记录。

问题:数据集太大。即使服务设置为12分钟超时。它仍然超时,代码失败。

NetSuite有一个异步进程,它基本上可以在服务器上运行你想要的任何内容,它将返回一个允许你检查服务器上的进程的JobId。

我目前所做的是先通过搜索电话询问所有供应商记录,然后在服务器上进行处理。在我获得JobId之后,我写了一个void Recursion,它检查作业是否在服务器上完成,并将Thread Sleep设置为10分钟。

 private static bool ChkProcess(VendorsService vendorService, string jobId)
    {
        var isJobDone = false;

        //Recursion 
        void ChkAsyncProgress(bool isFinish)
        {
            if (isFinish) return;

            var chkJobProgress = vendorService.NsCheckProcessStatus(jobId);
            if (chkJobProgress.OperationResult.IsFinish) isJobDone = true;

            Thread.Sleep(TimeSpan.FromMinutes(10));
            ChkAsyncProgress(isJobDone);
        }

        ChkAsyncProgress(false);
        return isJobDone;
    }

它工作但是有更好的方法吗?

谢谢

c# netsuite
1个回答
0
投票

我认为既然你已经在使用Azure了,使用Service BUS你可以为此实现一个非常低成本的解决方案(如果不是免费的,取决于你的工作频繁运行)

基本上它是一个队列,您将消息排入队列(也可以是具有属性的对象,因此它们也可能包含您的详细结果)。

服务总线用于排队。如果服务总线上的任何新消息已到达,则自动侦听ServiceBusTrigger类型的azure函数,如果是,则触发(或者,您可以将消息设置为入队,但仅在某个未来时间之后可用)。

因此,在webjob代码中,最后您可以添加代码以将消息排入队列,这将标记webjob已完成详细说明。

一旦消息进入队列,azure功能就会立即被注意到,你可以检索数据而不必轮询工作完成,因为azure会为你付出所有这些费用而且不需要你付出任何努力。

此外,这些任务不是基于定价的,而是基于执行的,因此只有当它有效地将消息放入队列时才会付费。

他们有一定数量的免费执行,所以你可能甚至不需要支付任何费用。

Here这样做的一些微软代码示例。

© www.soinside.com 2019 - 2024. All rights reserved.