首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用消息泵异步检查Azure队列

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

Stack Overflow用户
提问于 2016-08-22 19:22:48
回答 2查看 554关注 0票数 1

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

我不知道如何让这两种方法同时运行

这是Azure消息泵的默认实现。

代码语言:javascript
运行
复制
Client.OnMessage((receivedMessage) =>
                {

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

等待方法等待,直到调用manualResetEvent set方法。我不知道是什么设置了这个方法,我想它是在onmessage进程的幕后进行的。

现在发生的情况是,onmessage方法是否运行,它会命中waitone进程,并处于那里直到另一条消息传入,这是应该发生的,但是我如何使其中的两个同时运行呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-24 11:51:06

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

代码语言:javascript
运行
复制
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块中的代码。

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-08-24 06:40:28

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39087230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档