方案:一个Azure WebJob,它将通过WSDL从NetSuite获取所有供应商记录。
问题:数据集太大。即使服务设置为12分钟超时。它仍然超时,代码失败。
NetSuite具有一个异步进程,该进程基本上可以在服务器上运行任何所需的操作,并且它将返回JobId,该JobId允许您检查服务器上的进程。
我目前所做的是先进行搜索呼叫,以询问所有供应商记录,并将其在服务器上处理。得到JobId后,我编写了一个void Recursion,以将线程睡眠设置为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;
}
可以,但是有更好的方法吗?
谢谢
答案 0 :(得分:0)
我认为,由于您已经在使用Azure,因此Service BUS可以为此实现一个非常低成本的解决方案(如果不是免费的,则取决于您的工作运行频率)
基本上,这是一个队列,您可以在其中排队消息(消息也可以是具有属性的对象,因此它们也可能包含您的详细说明结果。)
使用服务总线入队。 类型为ServiceBusTrigger的azure函数会自动侦听服务总线上是否有任何新消息到达,并在触发时触发(或者,您可以将消息设置为排队,但仅在以后的某个时间可用)。
因此,在webjob代码中,最后您可以添加代码以使消息入队,以标记该webjob已完成详细说明。
当消息进入队列时,azure函数将立即被注意到,并且您可以检索数据而无需不断轮询以完成工作,因为azure将以可笑的价格为您提供所有这些服务,而无需任何费用你的努力。
此外,这些任务不是基于及时定价的,而是基于执行的,因此,只有在有效地将消息放入队列时,您才需要付费。
他们可以免费执行一定数量的处决,因此您甚至不需要支付任何费用。
Here某些用于此操作的Microsoft代码示例。