场景: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;
}
它工作但是有更好的方法吗?
谢谢
我认为既然你已经在使用Azure了,使用Service BUS你可以为此实现一个非常低成本的解决方案(如果不是免费的,取决于你的工作频繁运行)
基本上它是一个队列,您将消息排入队列(也可以是具有属性的对象,因此它们也可能包含您的详细结果)。
服务总线用于排队。如果服务总线上的任何新消息已到达,则自动侦听ServiceBusTrigger类型的azure函数,如果是,则触发(或者,您可以将消息设置为入队,但仅在某个未来时间之后可用)。
因此,在webjob代码中,最后您可以添加代码以将消息排入队列,这将标记webjob已完成详细说明。
一旦消息进入队列,azure功能就会立即被注意到,你可以检索数据而不必轮询工作完成,因为azure会为你付出所有这些费用而且不需要你付出任何努力。
此外,这些任务不是基于定价的,而是基于执行的,因此只有当它有效地将消息放入队列时才会付费。
他们有一定数量的免费执行,所以你可能甚至不需要支付任何费用。
Here这样做的一些微软代码示例。