1

我有一个用户将与之交互的 asp.net webforms 应用程序。当用户从站点中选择某些项目并单击一个按钮进行处理时。webapp 将为用户选择的每个项目添加一条消息到 msmq。

我想弄清楚的部分:

如果我的第二个应用程序的工作是处理队列 (msmq),它应该是什么类型的应用程序。关键是第二个应用程序需要处于空闲状态,直到我的 asp.net webapp 告诉它单击了“处理”按钮,然后它将继续检查队列并处理它。我不希望它每分钟左右不断检查队列,只在命令检查队列时。

Windows 服务、Web 服务、Web API?我目前有一个 Windows 服务,它每 30 秒检查一次队列。我怎样才能让它按需工作而不是不断检查?

在这里,它的措辞略有不同:

  1. 用户在 .NET 应用程序中并选择项目然后单击处理。

  2. .Net 应用程序将需要处理的项目添加到队列 (msmq)。

  3. .NET 应用程序将通知另一个应用程序进程按钮已被单击,并且它应该开始处理队列。处理完队列后,附加应用程序应返回某种空闲模式。

这里最重要的是我不希望它在每分钟检查队列中是否有项目的计时器上。这将消耗 24/7 运行的资源。

也许我对 msmq 的某些功能不熟悉。有没有办法 msmq 可以告诉我的服务它收到了队列中的消息,继续处理它们。而不是我的 .net 应用程序与服务通信?

4

1 回答 1

1

您可以使用现有的 Windows 服务。但是,与其每 30 秒左右检查一次队列,不如在队列中添加一个仅在消息到达时才响应的侦听器。请检查下面的片段。

static void Main(string[] args)
{
    //create an event
    MessageQueue msmq = new MessageQueue("queuename");
    //subscribe to the event
    msmq.ReceiveCompleted += msmq_ReceiveCompleted;
    //start listening
    msmq.BeginReceive();
}

//this will be fired everytime a message is received
static void msmq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
    //get the MessageQueue that we used 
    MessageQueue msmq = sender as MessageQueue;

    //read the message
    //and process it
    Message msg = msmq.EndReceive(e.AsyncResult);

    //because this method is only fired once everytime
    //a message is sent to the queue
    //we have to start listening again            
    msmq.BeginReceive();
}
于 2015-09-28T05:27:46.423 回答