3

我对消息传递(使用 MSMQ)有问题,这是快速生产者/慢消费者的一种变体。有没有办法在私有 MSMQ 队列中获得未使用的消息计数?我想用它来限制生产者。

我想在 MSMQ 中使用信号量范式,其中生产者应用程序仅在未完成的消息计数小于指定数量时才发送消息。

本质上,我想做类似以下的事情

///Producer pseudo-code 
    public void SendMessage(Message message, int totalMessagesSentCounter)
    {
       if (totalMessagesSentCounter % 1000 == 0)
       {
         while (outgoingQueue.GetMessageCount() > X)  ///Is this possible?
         {
             Sleep(Y milliseconds);
         }
        }
       outgoingQueue.Send(Message);
       totalMessagesSentCounter++;
    }

我的配置:Win XP/2003 和 MSMQ 3.0

4

2 回答 2

2

我没有使用 MSMQ 本身,但我确实有一个我发现有用的配方。

您有两个队列,而不是一个队列 - 每个方向一个。

“生产者”从来自消费者的队列中消费一个项目,并向消费者发送一条新消息。消费者每次消费时,都会在队列中放入一条新消息给生产者。

因此,通过这种方式,“令牌”提供了从消费者到生产者的反馈,从而将生产者限制为消费者的速度。

如果合适的话,一个技巧是简单地返回消息,而不是每次都重新分配。如果它是单进程的,并且消息数据很大且大小固定,这本身就可以成为采用这种设计的强大驱动力。

于 2010-02-04T16:49:14.657 回答
1

我不得不为 MSMQ 使用 COM 库。我发现以下链接有所帮助。

http://blog.codebeside.org/archive/2008/08/27/counting-the-number-of-messages-in-a-message-queue-in.aspx

于 2010-02-04T20:58:13.413 回答