andrew4582

MSMQMonitorComponent

Aug 21st, 2010
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.34 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Messaging;
  8. using System.Threading;
  9.  
  10. namespace DbMon.NET {
  11.     /// <summary>
  12.     /// Monitors a msmq queue and outputs the contents via 'OutputQueue'
  13.     /// </summary>
  14.     public partial class MSMQMonitorComponent:Component {
  15.  
  16.         bool _enabled;
  17.         bool _started;
  18.         bool _cancelled;
  19.         bool _paused;
  20.        
  21.         OutputQueue<DebugItem> _outputQueue;
  22.         public bool PurgeOnStartup { get; set; }
  23.  
  24.         public bool Enabled {
  25.             get {
  26.                 return _enabled;
  27.             }
  28.             set {
  29.                 _enabled = value;
  30.             }
  31.         }
  32.  
  33.         public bool Started {
  34.             get {
  35.                 return _started;
  36.             }
  37.             protected set {
  38.                 _started = value;
  39.             }
  40.         }
  41.         public bool Cancelled {
  42.             get {
  43.                 return _cancelled;
  44.             }
  45.             protected set {
  46.                 _cancelled = value;
  47.             }
  48.         }
  49.         public bool IsPaused {
  50.             get { return _paused; }
  51.             protected set { _paused = value; }
  52.         }
  53.  
  54.         public string QueuePath {
  55.             get {
  56.                 return _msmq.Path;
  57.             }
  58.         }
  59.         public MSMQMonitorComponent() {
  60.             _enabled = true;
  61.             InitializeComponent();
  62.         }
  63.         public MSMQMonitorComponent(IContainer container) {
  64.             container.Add(this);
  65.             InitializeComponent();
  66.         }
  67.         public virtual void Pause() {
  68.             IsPaused = true;
  69.         }
  70.         public virtual void Resume() {
  71.             IsPaused = false;
  72.             beginReceive(_msmq);
  73.         }
  74.         public virtual void Start(string queuePath,OutputQueue<DebugItem> outputQueue) {
  75.             if(Started)
  76.                 throw new InvalidOperationException("Already Started");
  77.             _outputQueue = outputQueue;
  78.  
  79.             Started = true;
  80.             Cancelled = false;
  81.             string path = queuePath ?? @".\private$\dbmon";
  82.             if(!MessageQueue.Exists(path))
  83.                 MessageQueue.Create(path);
  84.  
  85.             _msmq.Path = path;
  86.             _msmq.Formatter = new ActiveXMessageFormatter();
  87.             _msmq.ReceiveCompleted += msmq_ReceiveCompleted;
  88.            
  89.             if(PurgeOnStartup) {
  90.                 _msmq.Purge();
  91.                 writePurgeMessage();
  92.             }
  93.             beginReceive(_msmq);
  94.         }
  95.         void writePurgeMessage() {
  96.             var message = new Message("Queue Purged");
  97.             message.Formatter = new ActiveXMessageFormatter();
  98.             message.Priority = MessagePriority.Highest;
  99.             _msmq.Send(message);
  100.         }
  101.         public virtual void Stop() {
  102.             Cancelled = true;
  103.             _msmq.ReceiveCompleted -= msmq_ReceiveCompleted;
  104.             Started = false;
  105.         }
  106.         void msmq_ReceiveCompleted(object sender,System.Messaging.ReceiveCompletedEventArgs e) {
  107.             if(Cancelled)
  108.                 return;
  109.            
  110.             int pid = -1;
  111.             MessageQueue queue = e.AsyncResult.AsyncState as MessageQueue;
  112.             DebugItem di = new DebugItem(pid,queue.QueueName);
  113.             bool timedOut = false;
  114.            
  115.             try {
  116.                 var msg = queue.EndReceive(e.AsyncResult);
  117.                 var body = msg.Body;
  118.                 if(body == null)
  119.                     body = string.Empty;
  120.                 if(checkPurgeQueue(queue,msg,body)) {
  121.                     body += " PURGED @ " + DateTime.Now.ToUniversalTime() + " UTC";
  122.                 }
  123.                 di = new DebugItem(pid,body.ToString()) {
  124.                     ProcessName = queue.Path
  125.                 };
  126.             }
  127.             catch(MessageQueueException mqerr) {
  128.                 var code = mqerr.MessageQueueErrorCode;
  129.                 if(code == MessageQueueErrorCode.IOTimeout) {
  130.                     timedOut = true;
  131.                     return;
  132.                 }
  133.                 else {
  134.                     di = new DebugItem(pid,"MSMQ ERROR -> " + mqerr.Message + ";Code -> " + code.ToString());
  135.                 }
  136.             }
  137.             catch(Exception err) {
  138.                 di = new DebugItem(pid,"CRITICAL ERROR -> " + err.Message + ";Details -> " + err.ToString());
  139.             }
  140.             finally {
  141.                 try {
  142.                     if(!timedOut)
  143.                         _outputQueue.EnqueueOutput(di);
  144.                 }
  145.                 finally {
  146.                     if(!Cancelled)
  147.                         beginReceive(queue);
  148.                 }
  149.             }
  150.         }
  151.         void beginReceive(MessageQueue queue) {
  152.             if(!Enabled)
  153.                 return;
  154.             if(IsPaused)
  155.                 return;
  156.             var timeOut = TimeSpan.FromSeconds(10);
  157.             queue.BeginReceive(timeOut,queue);
  158.         }
  159.         bool checkPurgeQueue(MessageQueue queue,Message msg,object body) {
  160.             string path = queue.Path;
  161.             string bodyMsg = body.ToString();
  162.             if(bodyMsg == path + MSMQWriter.PURGE_TOKEN) {
  163.                 queue.Purge();
  164.                 return true;
  165.             }
  166.            
  167.             return false;
  168.         }
  169.     }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment