. net应用程序的按钮单击需要告诉外部服务从队列(msmq)开始处理

本文关键字:队列 服务 msmq 处理 开始 外部 按钮 应用程序 单击 net | 更新日期: 2023-09-27 18:13:09

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

我想弄明白的部分:

如果第二个应用程序的任务是处理队列(msmq),那么它应该是什么类型的应用程序?关键是第二个应用程序需要闲置,直到我的asp.net webapp告诉它"进程"按钮被点击,然后它将继续,检查队列并处理它。我不希望它每分钟检查一次队列,只在命令时检查队列。

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

这里的改写略有不同:

  1. 用户在。net应用程序中选择项目,然后单击进程。

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

  3. 一个额外的应用程序将被。net应用程序告知,进程按钮被点击了,它应该开始处理队列。一旦队列处理完毕,附加的应用程序就应该回到某种空闲模式。

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

也许我对msmq的某些特性不熟悉。是否有一种方法msmq可以告诉我的服务,它在队列中收到消息,继续处理它们。而不是我的。net应用程序与服务对话?

. net应用程序的按钮单击需要告诉外部服务从队列(msmq)开始处理

您可以使用您现有的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();
}