在我的应用程序中,我希望使用设置的消息泵检查主队列和死信队列。我遇到的问题是默认实现上的线程。
我不知道如何让这两种方法同时运行
这是Azure消息泵的默认实现。
Client.OnMessage((receivedMessage) =>
{
}, new OnMessageOptions { AutoComplete = false});
CompletedEvent.WaitOne()等待方法等待,直到调用manualResetEvent set方法。我不知道是什么设置了这个方法,我想它是在onmessage进程的幕后进行的。
现在发生的情况是,onmessage方法是否运行,它会命中waitone进程,并处于那里直到另一条消息传入,这是应该发生的,但是我如何使其中的两个同时运行呢?
发布于 2016-08-24 11:51:06
假设您有一个运行代码的控制台应用程序:
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();
}
}发布于 2016-08-24 06:40:28
也许我没有跟进您的问题,但是您在这里得到的是一个在OnMessage API中注册的回调,如果收到一条消息,您的主程序将继续运行。为什么要在回调之外执行WaitOne?回调的目的是在后台紧密循环中运行并接收您的消息。
如果您只想接收一两条消息,那么使用QueueClient (或类似的)是更好的选择吗?
https://stackoverflow.com/questions/39087230
复制相似问题