Azure ServiceBus QueueClient.OnMessage是否在其他线程上执行

Dan*_*nds 10 azure azureservicebus

QueueClient.OnMessage方法是否总是在不同的线程上执行回调参数?

我假设如果MaxConcurrentCalls设置为10,那么queueClient将最多启动10个线程来并行处理消息.如果传入MaxConcurrentConnection值为1或者它是否在当前线程上执行,是否会创建新线程?

我的实际问题:
在一个Worker角色中我想处理多个队列,但是它们都会同时处理.例如

        _queueClient1.OnMessage(x =>
            {
                // Do something
            }, new OnMessageOptions { MaxConcurrentCalls = 1});

        _queueClient2.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient3.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient4.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });
Run Code Online (Sandbox Code Playgroud)

这是否会导致每个回调并行执行,以便_queueClient4回调不等待_queueClient2完成才能执行?

Abh*_*Lal 10

当您使用OnMessage它注册回调时,将在另一个线程上调用它.如果设置MaxConcurrentCalls为10,那么我们将为10条消息创建10个线程,并同时为每条消息回调所有这些消息.您可以在上面显示的队列中执行此操作,但当然在每个单独的回调处理之间没有完成同步或排序.

当我们在新线程上调用回调时,它对于该特定执行/消息是同步的,直到该方法完成或抛出异常,消息处理未完成.如果MaxConcurrentCalls为0,那么对于每个注册的回调,只会处理一个线程.但是,当您有不同的QueueClient实例时,您可以向它们注册不同的回调,或者使用不同的并发计数等注册相同的回调.

  • 线程仅在有要处理的消息时才会启动.只有一个待处理的Receive调用,它会在接收到的消息的不同线程上同时调用回调,直到达到MaxConcurrentCalls计数. (3认同)