diff Messaging/Server/Listeners/MsmqListener.cs @ 29:9919ee227c93

msmq added
author adminsh@apollo
date Wed, 21 Mar 2012 22:09:18 +0000
parents
children 7d9de5746f18
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Messaging/Server/Listeners/MsmqListener.cs	Wed Mar 21 22:09:18 2012 +0000
@@ -0,0 +1,57 @@
+using System;
+using System.Messaging;
+using Common.Messages;
+using GalaSoft.MvvmLight.Messaging;
+using Server.Interfaces;
+
+namespace Server.Listeners
+{
+    public class MsmqListener : IListener
+    {
+        public bool IsListening { get; set; }
+
+        private readonly MessageQueue _mq;
+
+        public MsmqListener(string queueName)
+        {
+            _mq = MessageQueue.Exists(queueName)
+                ? new MessageQueue(queueName)
+                : MessageQueue.Create(queueName);
+
+            _mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
+        }
+
+        public void Start()
+        {
+            if (IsListening) return;
+
+            Messenger.Default.Send(new MsmqLogMessage() { Body = "Opening listener..." });
+            IsListening = true;
+            while (IsListening)
+            {
+                try
+                {
+                    var message = _mq.Receive().Body;
+                    Messenger.Default.Send(new MsmqClientMessage());
+                }
+                catch (MessageQueueException mqe)
+                {
+                    Messenger.Default.Send(new MsmqLogMessage() { Body = mqe.Message });
+                }
+                catch (Exception e)
+                {
+                    Messenger.Default.Send(new MsmqLogMessage() { Body = e.Message });
+                }
+            }
+        }
+
+        public void Stop()
+        {
+            if (!IsListening) return;
+            Messenger.Default.Send(new MsmqLogMessage() { Body = "Closing listener..." });
+            _mq.Close();
+            IsListening = false;
+            Messenger.Default.Send(new MsmqLogMessage() { Body = "Closed." });
+        }
+    }
+}