2015-09-17 6 views
1

У меня есть приложение asp.net webforms, с которым будут взаимодействовать пользователи. Когда пользователь выбирает определенные элементы с сайта и нажимает кнопку для обработки. Webapp добавит сообщение в msmq для каждого элемента, который пользователь выбирает.Кнопка щелчка приложения .NET должна сообщить внешней службе, чтобы начать обработку из очереди (msmq)

Часть Я пытаюсь выяснить:

Какой тип приложения должен мое второе приложение, если его работа будет обрабатывать очереди (MSMQ). Ключ в том, что этому второму приложению нужно сидеть без дела, пока мой asp.net webapp не сообщит ему, что нажата кнопка «Процесс», затем она будет идти вперед, проверять очередь и обрабатывать ее. Я не хочу, чтобы он постоянно проверял очередь каждую минуту или только, только по команде проверяли очередь.

Служба Windows, веб-сервис, веб-интерфейс? В настоящее время у меня есть служба Windows, которая проверяет очередь каждые 30 секунд. Как я могу заставить его работать по требованию, а не постоянно проверять?

Здесь она перефразировать немного отличается:

  1. Пользователь в приложении .NET и выбирает элементы затем нажимает процесс.

  2. Приложение .Net добавляет элементы, которые необходимо обрабатывать в очереди (msmq).

  3. Приложение .NET сообщит, что нажата кнопка процесса и что она должна начать обработку очереди. После обработки очереди дополнительное приложение должно вернуться в какой-то режим ожидания.

Главное, что я не хочу, чтобы это было на таймере, который проверяет, есть ли пункты в очереди каждую минуту. Это приведет к тому, что ресурсы будут работать круглосуточно и без выходных.

Возможно, я не знаком с некоторыми функциями msmq. Есть ли способ, который msmq может сообщить моей службе, что он получил сообщения в очереди, продолжите и обработайте их. Вместо моего приложения .net, разговаривающего с сервисом?

+2

Если обработка очереди только когда-либо происходит по требованию, то почему там должны быть вторым приложение на всех, а не только асинхронный вызов из основного веба приложения? Если вы настроены на то, что это второе приложение, возможно, служба Windows будет лучше, чем служба WCF или MVC WebAPI, потому что родная служба Windows обычно будет быстрее с меньшими накладными расходами. Но ничто не мешает вам использовать вашу логику в методе службы WCF или MVC WebAPI. – Jim

+0

Хм, это определенно напомнилось, но мне сказали, что он работает асинхронно с IIS, если процесс завершился неудачей, и все IIS отключились, поэтому я хотел оставить его отдельным. В настоящее время у меня есть служба Windows, но она настроена на проверку очереди msmq каждые 30 секунд. Как я могу сделать это так, чтобы он нажал кнопку мыши на моем приложении .NET или по требованию каким-либо другим способом. Это возможно? Если не нажать кнопку «Вкл.», То всякий раз, когда элемент добавляется в очередь. Причина, по которой я думал о Wep API или веб-сервисе над Windows Service, потому что мое .net-приложение может легче общаться с ними. –

+1

Вы можете создать службу Windows, которая имеет общедоступные методы.Вы пишете метод ProcessQueue, и вы вызываете его из своего веб-приложения, асинхронно, не дожидаясь его завершения. Когда вы говорите, что «все IIS выключается», если асинхронный вызов метода не выполняется, это неверно. Если у вас есть необработанное исключение в порожденном потоке (которого вы всегда должны избегать, имея уловку try/catch), он убьет ваш рабочий поток, но при следующем запросе будет создан воссозданный рабочий поток. – Jim

ответ

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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^