在我的应用程序中,我想使用设置的消息泵检查主队列和死信队列。我遇到的问题是默认实现的线程化。
我不确定如何同时运行这两个
这是Azure
的消息泵的默认实现Client.OnMessage((receivedMessage) =>
{
}, new OnMessageOptions { AutoComplete = false});
CompletedEvent.WaitOne()
waitone方法一直等到调用manualResetEvent set方法。 我不确定是什么设置了该方法,我猜它是在onmessage过程的幕后发生的事情。
现在发生了什么,onmessage方法运行并且它击中了waitone进程并坐在那里直到另一条消息进入,这应该发生,但我怎么能让它们中的两个同时运行时间?
答案 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
(或类似)是更好的选择吗?