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

本文关键字:异步 检查 队列 Azure 消息 | 更新日期: 2023-09-27 18:03:40

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

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

这是Azure消息泵的默认实现

Client.OnMessage((receivedMessage) =>
                {
                }, new OnMessageOptions { AutoComplete = false});
            CompletedEvent.WaitOne()

waitone方法等待,直到调用manualResetEvent集合方法。我不确定是什么设置方法,我猜是在onmessage进程的幕后发生的事情。

现在发生的是,onmessage方法运行,它到达waitone进程,直到另一个消息进来,这是应该发生的,但我如何让两个同时运行?

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

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

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

也许我没有遵循你的问题,但是你在这里得到的是一个回调注册与OnMessage API和主程序的延续,如果收到一条消息。为什么要在回调之外执行WaitOne ?Callback在后台以一个紧密循环的方式运行,接收你的消息。

如果您只想接收一个或两个消息,也许使用QueueClient(或类似的)是一个更好的选择?