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

时间:2013-08-15 14:51:50

标签: azure azureservicebus

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

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

我的实际问题:
在工作者角色中,我想处理多个队列,但是它们都会同时处理。 E.g。

        _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 });

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

1 个答案:

答案 0 :(得分:10)

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

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