2016-11-18 1 views
5

Я новичок в Microsoft Message Queue в Windows Server, мне нужно нажать, если EmployeeID равен NULL.Проверка очередности проверки с использованием MSMQ в C#

Работник Модель Класс

public class Employee 
{ 
    public string EmployeeID { get; set; } 
    public string EmployeeName { get; set; } 
} 

public void ValidationProcess(Employee emp) 
{ 
    if((emp != null) || (emp.EmployeeID == null)) 
    { 
     // Push into Validation Exception Queue using MSMQ 
    } 
} 

После того, как данные толкнул в этой очереди проверки исключений, он должен быть обработан в виде отдельного процесса. Каждые 1 час процесс необходимо инициировать, и он должен вызвать следующий метод:

public void ValidationExceptionProcess(object obj) 
{ 
    // Some Inner Process 

    // Log the Error 
} 

Просьба указать, как его создавать и обрабатывать.

ответ

2

Первый шаг: Установите MSMQs в качестве а окна имеют на сервере/ПК

Тогда:
- Создать очередь, если она не существует
- Push сообщения в очереди асинхронно
полезной guide

пример кода для толкания и получения сообщений от MSMQ:

public class ExceptionMSMQ 
    { 
     private static readonly string description = "Example description"; 
     private static readonly string path = @".\Private$\myqueue"; 
     private static MessageQueue exceptionQueue; 
     public static MessageQueue ExceptionQueue 
     { 
      get 
      { 
       if (exceptionQueue == null) 
       { 
        try 
        { 
         if (MessageQueue.Exists(path)) 
         { 
          exceptionQueue = new MessageQueue(path); 
          exceptionQueue.Label = description; 
         } 
         else 
         { 
          MessageQueue.Create(path); 
          exceptionQueue = new MessageQueue(path); 
          exceptionQueue.Label = description; 
         } 
        } 
        catch 
        { 
         throw; 
        } 
        finally 
        { 
         exceptionQueue.Dispose(); 
        } 
       } 
       return exceptionQueue; 
      } 
     } 

     public static void PushMessage(string message) 
     { 
      ExceptionQueue.Send(message); 
     } 

     private static List<string> RetrieveMessages() 
     { 
      List<string> messages = new List<string>(); 
      using (ExceptionQueue) 
      { 
       System.Messaging.Message[] queueMessages = ExceptionQueue.GetAllMessages(); 
       foreach (System.Messaging.Message message in queueMessages) 
       { 
        message.Formatter = new XmlMessageFormatter(
        new String[] { "System.String, mscorlib" }); 
        string msg = message.Body.ToString(); 
        messages.Add(msg); 
       } 
      } 
      return messages; 
     } 

     public static void Main(string[] args) 
     { 
      ExceptionMSMQ.PushMessage("my exception string"); 

     } 
    } 


Другим широко используемым способом сделать это также будет использование ящиков, которые уже содержат такую ​​функциональность, как Enterprise Library или NLog, которые предоставляют простые интерфейсы для этого.

Для получения сообщений я бы рекомендовал отдельную службу Windows, которая периодически читала сообщения и обрабатывала их. Хороший пример того, как сделать это дается здесь: Windows service with timer

Обновление: Windows Service Пример:

MSMQConsumerService.cs

public partial class MSMQConsumerService : ServiceBase 
{ 
    private System.Timers.Timer timer; 

    public MSMQConsumerService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     this.timer = new System.Timers.Timer(30000D); // 30000 milliseconds = 30 seconds 
     this.timer.AutoReset = true; 
     this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.ProcessQueueMessages); 
     this.timer.Start(); 
    } 

    protected override void OnStop() 
    { 
     this.timer.Stop(); 
     this.timer = null; 
    } 

    private void ProcessQueueMessages(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     MessageProcessor.StartProcessing(); 
    } 

} 

и MessageProcessor.cs

public class MessageProcessor 
    { 
     public static void StartProcessing() 
     { 
      List<string> messages = ExceptionMSMQ.RetrieveMessages(); 
      foreach(string message in messages) 
      { 
       //write message in database 
      } 
     } 
    } 
+0

Не могли бы вы рассказать о своем ответе соответствующим кодом. –

+0

@ B.Balamanigandan здесь вы друг. Добавлен код, который поможет вам. Надеюсь, теперь все более ясно. – Pan

+0

Довольно хорошо ... Мне нужно вызвать метод чтения через службу Windows. Эта служба должна инициировать вызов для выполнения метода чтения. - Пожалуйста, поделитесь своей идеей в этой части. –