我要求在收到(MSMQ)队列中出现的单个邮件时批量处理多个Web服务调用。
" sagas"要走的路?
与第三方Web服务的交互更加复杂,因为我需要调用一次,然后随后轮询一个带有相关ID的确认,在对Web服务的初始调用的回复中返回。
答案 0 :(得分:0)
是的,sagas可以协调启动呼叫的过程,轮询直到操作结束,然后在完成所有工作后再做其他事情。
如果您不小心不小心不小心多次调用Web服务,您可以轻松使用Rebus'async
功能来实现轮询 - 我目前正在构建基本的内容这样做:
public async Task Handle(SomeMessage message)
{
var response = await _client.Get<SomeResponse>("https://someurl") ;
var pollUrl = response.PollUrl;
var resultUrl = response.ResultUrl;
while(true)
{
var result = await _client.Get<PollResult>(pollUrl);
if (result.Status == PollStatus.Processing)
{
await Task.Delay(TimeSpan.FromSeconds(2));
continue;
}
if (result.Status == PollStatus.Done)
{
var finalResult = await _client.Get<FinalResult>(resultUrl);
return new SomeReply(finalResult);;
}
throw new Exception($"Unexpected status while polling {pollUrl}: {result.Status}")
}
}
因此利用async
/ await
在处理时轮询外部Web服务,同时消耗最少的资源。