使用消息泵异步检查Azure队列

时间:2016-08-22 19:22:49

标签: c# azure azureservicebus

在我的应用程序中,我想使用设置的消息泵检查主队列和死信队列。我遇到的问题是默认实现的线程化。

我不确定如何同时运行这两个

这是Azure

的消息泵的默认实现
Client.OnMessage((receivedMessage) =>
                {

                }, new OnMessageOptions { AutoComplete = false});
            CompletedEvent.WaitOne()

waitone方法一直等到调用manualResetEvent set方法。 我不确定是什么设置了该方法,我猜它是在onmessage过程的幕后发生的事情。

现在发生了什么,onmessage方法运行并且它击中了waitone进程并坐在那里直到另一条消息进入,这应该发生,但我怎么能让它们中的两个同时运行时间?

2 个答案:

答案 0 :(得分:1)

假设您有一个运行代码的控制台应用程序:

public class Program
{
    private static void Main()
    {
        var completedEvent = new ManualResetEvent(false);
        ...
        var mainQueue = QueueClient.CreateFromConnectionString("MyConnectionString", "MyQueueName");

        mainQueue.OnMessage((receivedMessage) =>
        {

        }, new OnMessageOptions { AutoComplete = false });

        completedEvent.WaitOne();
    }
}

如果删除completedEvent.WaitOne();,您的控制台应用将立即退出。此行确保您的应用程序不会退出。您可以改为编写while(true) {}(不推荐,但这是另一个主题)。

消息泵不阻止当前:这就是为什么你需要阻止线程(在控制台应用程序,azure webjob,azure worker角色的情况下)让你的应用程序不要退出。如果将此代码实现到Windows服务或Web应用程序中,则不必阻止主线程,因为还有其他机制可以使应用程序保持运行。

当新消息到达时,消息泵会旋转一个新线程来执行OnMessage块内的代码。

因此,如果你想要同时监听主队列和死信队列,你可以这样做:

public class Program
{
    private static void Main()
    {
        var completedEvent = new ManualResetEvent(false);
        ...
        var mainQueue = QueueClient.CreateFromConnectionString("MyConnectionString", "MyQueueName");
        var deadLetterQueue = QueueClient.CreateFromConnectionString("MyConnectionString", QueueClient.FormatDeadLetterPath("MyQueueName"));

        mainQueue.OnMessage((receivedMessage) =>
        {

        }, new OnMessageOptions { AutoComplete = false });

        deadLetterQueue.OnMessage((receivedMessage) =>
        {

        }, new OnMessageOptions { AutoComplete = false });

        completedEvent.WaitOne();
    }
}

答案 1 :(得分:0)

也许我没有关注你的问题,但你在这里得到的是一个在OnMessage API上注册的回调,如果收到一条消息,你的主程序会继续。你为什么要在回调之外做WaitOne?回调旨在在后台紧密循环中运行并接收您的消息。

如果您只想收到一条或两条消息,可能使用QueueClient(或类似)是更好的选择吗?