使用消息泵对Azure队列进行异步检查
本文关键字:异步 检查 队列 Azure 消息 | 更新日期: 2023-09-27 18:03:40
在我的应用程序中,我想使用设置的消息泵检查主队列和死信队列。我遇到的问题是默认实现上的线程。
我不确定如何让这两个同时运行
这是Azure消息泵的默认实现
Client.OnMessage((receivedMessage) =>
{
}, new OnMessageOptions { AutoComplete = false});
CompletedEvent.WaitOne()
waitone方法等待,直到调用manualResetEvent集合方法。我不确定是什么设置方法,我猜是在onmessage进程的幕后发生的事情。
现在发生的是,onmessage方法运行,它到达waitone进程,直到另一个消息进来,这是应该发生的,但我如何让两个同时运行?
假设你有一个控制台应用程序运行你的代码:
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
(或类似的)是一个更好的选择?