ReceiveAsync和OnMessageAsync

时间:2016-10-28 14:52:42

标签: c# azure azureservicebus azure-servicebus-queues

服务工作者有两种方法来处理来自 Azure服务总线队列的消息:

while (!ExitRequested)
{
    try
    {
        var message = await _queueClient.ReceiveAsync(TimeSpan.FromSeconds(1));

        if (message != null)
            ProcessIt(message);
    }
    catch (Exception ex)
    {
        HandleIt(ex);
    }
}

EAP

var onMessageOptions = new OnMessageOptions();

onMessageOptions.ExceptionReceived += (sender, args) => HandleIt(args.Exception);

_queueClient.OnMessageAsync(ProcessIt, onMessageOptions);

WaitFor(ExitRequested);

这两种方法的优点和缺点是什么?应该在哪种特定场景中选择哪一个?

1 个答案:

答案 0 :(得分:1)

ReceiveAsync是ASB .NET客户端API的一部分。 OnMessage API是本机ASB客户端提供的简化并发消息泵创建的方式,允许您“开箱即用”的一些功能,以便您不必手动处理这些功能。其中包括:

  1. 轻松注册消息泵作为回调
  2. 消息自动完成
  3. 自动续订超时以简化锁定令牌续订
  4. 处理并发泵/回调
  5. 当您需要灵活性和严格控制事物时,这些优势也可被视为缺点。例如,如果您需要控制消息完成的执行方式,则需要关闭自动完成功能并自行完成。但是,当你需要在回调中一次处理多个传入消息时,OnMessage API不会让你,因为它一次只提供一条消息,你最好使用[ReceiveBatchAsync][1]。我有post about OnMessage API个好处,你可以查看。

      

    应该在哪种特定情况下选择哪一个?

    根据您的要求和架构,您需要自己回答这些问题。如果您不需要严格控制事物并且一次处理一条消息(假设您可以同时执行多个消息处理),OnMessage API是一个简单的开始路径,ASB客户端做得很好。如果您需要处理批次并控制许多较低级别的方面,请使用MessageSender / MessageReceiver方法。