使用Rebus进行分散/收集

时间:2016-04-12 16:46:58

标签: rebus

我要求在收到(MSMQ)队列中出现的单个邮件时批量处理多个Web服务调用。

" sagas"要走的路?

与第三方Web服务的交互更加复杂,因为我需要调用一次,然后随后轮询一个带有相关ID的确认,在对Web服务的初始调用的回复中返回。

1 个答案:

答案 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服务,同时消耗最少的资源。