ReceiveAsync和OnMessageAsync的区别

本文关键字:区别 OnMessageAsync ReceiveAsync | 更新日期: 2023-09-27 18:15:21

service worker有两种方法来处理来自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);

这两种方法的优缺点是什么?在什么情况下应该选择哪一个?

ReceiveAsync和OnMessageAsync的区别

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

  1. 轻松注册您的消息泵作为回调
  2. 消息自动完成
  3. 自动更新超时以简化锁令牌更新
  4. 并发泵/回调的处理

当你需要对事物的灵活性和严格控制时,这些优点也可以被视为缺点。例如,如果您需要控制如何执行消息完成,您可以关闭自动完成并自己完成。但是,当你需要在回调中一次处理多个传入消息时,OnMessage API不会让你,因为它一次提供一个消息,你最好使用[ReceiveBatchAsync][1]。我有一篇关于OnMessage API好处的文章,你可以回顾一下。

在哪个特定的场景中应该选择哪一个?

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