Beispiel #1
0
 internal void AddAckMessageInfo(Guid deliveryID, AckMessageInfo ackMessageInfo)
 {
     lock (Messages)
     {
         Messages.Add(deliveryID, ackMessageInfo);
     }
 }
Beispiel #2
0
 public MessageArrivedState(MessageArrivedEventHandler handler, ServiceEventMessage message, MessageQueue queue, AckMessageInfo ackMessageInfo)
 {
     AckMessageInfo = ackMessageInfo;
     Handler        = handler;
     Message        = message;
     Queue          = queue;
 }
            public MessageArrivedState(MessageArrivedEventHandler handler, ServiceEventMessage message,MessageQueue queue, AckMessageInfo ackMessageInfo)
			{
                AckMessageInfo = ackMessageInfo;
				Handler = handler;
				Message = message;
                Queue = queue;
			}
			internal void AddAckMessageInfo(Guid deliveryID, AckMessageInfo ackMessageInfo)
			{
				lock (Messages)
				{
					Messages.Add(deliveryID, ackMessageInfo);
				}
			}
Beispiel #5
0
 private void RespondToMessage(ServiceEventMessage message, MessageQueue messageQueue, AckMessageInfo ackMessageInfo)
 {
     try
     {
         messageQueue.Messages.Remove(ackMessageInfo.DeliveryID);
         if (ackMessageInfo.TotalNack == 0)
         {
             if (ackMessageInfo.TotalAck == 0)
             {
                 _DALRabbitMQ.Reject(message);
             }
             if (messageQueue.Channel != null && messageQueue.Channel.IsOpen)
             {
                 messageQueue.Channel.BasicAck(ackMessageInfo.DeliveryTag, false);
             }
         }
         else
         {
             if (message.Parameters.ContainsKey("RequeueCount"))
             {
                 message.Parameters["RequeueCount"] = (int)((long)(message.Parameters["RequeueCount"])) + 1;
             }
             else
             {
                 message.Parameters.Add("RequeueCount", (int)1);
             }
             _DALRabbitMQ.Requeue(message);
             if (!message.QueueAfterTime.HasValue)
             {
                 Thread.Sleep(50);
             }
             if (messageQueue.Channel != null && messageQueue.Channel.IsOpen)
             {
                 messageQueue.Channel.BasicAck(ackMessageInfo.DeliveryTag, false);
             }
             //_Model.BasicReject(ackMessageInfo.DeliveryTag, true);
         }
     }
     catch (Exception ex)
     {
         _ConnectionShutdown = true;
         _TriggerSubscriptionRequest.Set();
         ApplicationEventLog.WriteEntry("Flow", string.Concat("Failed to Ack/Nack", messageQueue.QueueName, ":\r\n", ex.ToString()), System.Diagnostics.EventLogEntryType.Error);
     }
 }
Beispiel #6
0
 void IBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body)
 {
     try
     {
         if (_ProcessMessages)
         {
             Interlocked.Increment(ref _MessageHandlingCount);
             MessageFormatter    messageFormatter = new MessageFormatter();
             ServiceEventMessage message          = messageFormatter.Deserialise(new MemoryStream(body));
             lock (_Queues)
             {
                 if (_Queues.ContainsKey(consumerTag))
                 {
                     MessageQueue queue = _Queues[consumerTag];
                     message.DeliveryID = Guid.NewGuid();
                     AckMessageInfo ackMessageInfo = new AckMessageInfo();
                     ackMessageInfo.DeliveryID     = message.DeliveryID;
                     ackMessageInfo.QueueName      = queue.QueueName;
                     ackMessageInfo.DeliveryTag    = deliveryTag;
                     ackMessageInfo.TotalExpected  = queue.Handlers.Count;
                     ackMessageInfo.ChannelHandler = this;
                     queue.AddAckMessageInfo(message.DeliveryID, ackMessageInfo);
                     message.Queue = queue.QueueName;
                     for (int index = 0; index < queue.Handlers.Count; index++)
                     {
                         try
                         {
                             MessageArrivedEventHandler handler = queue.Handlers[index];
                             handler.BeginInvoke(_ConnectionFactory.HostName, message, _Subscription.InvokeCallBack, new MessageArrivedState(handler, message, queue, ackMessageInfo));
                         }
                         catch (Exception ex)
                         {
                             _Subscription.NackMessage(message);
                             ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
                         }
                     }
                     if (queue.Handlers.Count == 0)
                     {
                         Thread.Sleep(500);
                         _Model.BasicReject(deliveryTag, true);
                         Interlocked.Decrement(ref _MessageHandlingCount);
                         ApplicationEventLog.WriteEntry("Flow", string.Format("No handlers to process message {0}", consumerTag), System.Diagnostics.EventLogEntryType.Error);
                     }
                 }
                 else
                 {
                     Thread.Sleep(500);
                     _Model.BasicReject(deliveryTag, true);
                     Interlocked.Decrement(ref _MessageHandlingCount);
                     ApplicationEventLog.WriteEntry("Flow", string.Format("HandleBasicDeliver: Failed to locate queue {0}", consumerTag), System.Diagnostics.EventLogEntryType.Error);
                 }
             }
         }
     }
     catch (System.Runtime.Serialization.SerializationException)
     {
         string path = GetBadMessageDirectory();
         File.WriteAllBytes(Path.Combine(path, string.Concat(consumerTag, "_", Guid.NewGuid().ToString())), body);
         _Model.BasicReject(deliveryTag, false);
         Interlocked.Decrement(ref _MessageHandlingCount);
     }
     catch (Exception ex)
     {
         Thread.Sleep(500);
         try
         {
             if (_Model != null)
             {
                 _Model.BasicReject(deliveryTag, true);
             }
             Interlocked.Decrement(ref _MessageHandlingCount);
         }
         catch { }
         ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
     }
 }
		private void RespondToMessage(ServiceEventMessage message, MessageQueue messageQueue, AckMessageInfo ackMessageInfo)
		{
			try
			{
				messageQueue.Messages.Remove(ackMessageInfo.DeliveryID);
				if (ackMessageInfo.TotalNack == 0)
				{
					if (ackMessageInfo.TotalAck == 0)
						_DALRabbitMQ.Reject(message);
					if (messageQueue.Channel != null && messageQueue.Channel.IsOpen)
						messageQueue.Channel.BasicAck(ackMessageInfo.DeliveryTag, false);
				}
				else
				{
					if (message.Parameters.ContainsKey("RequeueCount"))
						message.Parameters["RequeueCount"] = (int)((long)(message.Parameters["RequeueCount"])) + 1;
					else
						message.Parameters.Add("RequeueCount", (int)1);
					_DALRabbitMQ.Requeue(message);
					if (!message.QueueAfterTime.HasValue)
						Thread.Sleep(50);
					if (messageQueue.Channel != null && messageQueue.Channel.IsOpen)
						messageQueue.Channel.BasicAck(ackMessageInfo.DeliveryTag, false);
					//_Model.BasicReject(ackMessageInfo.DeliveryTag, true);
				}
			}
			catch (Exception ex)
			{
				_ConnectionShutdown = true;
				_TriggerSubscriptionRequest.Set();
				ApplicationEventLog.WriteEntry("Flow", string.Concat("Failed to Ack/Nack", messageQueue.QueueName, ":\r\n", ex.ToString()), System.Diagnostics.EventLogEntryType.Error);
			}
		}
			void IBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body)
			{
				try
				{
					if (_ProcessMessages)
					{
						Interlocked.Increment(ref _MessageHandlingCount);
                        MessageFormatter messageFormatter = new MessageFormatter();
                        ServiceEventMessage message = messageFormatter.Deserialise(new MemoryStream(body));
						lock (_Queues)
						{
							if (_Queues.ContainsKey(consumerTag))
							{
								MessageQueue queue = _Queues[consumerTag];
								message.DeliveryID = Guid.NewGuid();
								AckMessageInfo ackMessageInfo = new AckMessageInfo();
								ackMessageInfo.DeliveryID = message.DeliveryID;
								ackMessageInfo.QueueName = queue.QueueName;
								ackMessageInfo.DeliveryTag = deliveryTag;
								ackMessageInfo.TotalExpected = queue.Handlers.Count;
								ackMessageInfo.ChannelHandler = this;
								queue.AddAckMessageInfo(message.DeliveryID, ackMessageInfo);
								message.Queue = queue.QueueName;
								for (int index = 0; index < queue.Handlers.Count; index++)
								{
									try
									{
										MessageArrivedEventHandler handler = queue.Handlers[index];
										handler.BeginInvoke(_ConnectionFactory.HostName, message, _Subscription.InvokeCallBack, new MessageArrivedState(handler, message, queue, ackMessageInfo));
									}
									catch (Exception ex)
									{
										_Subscription.NackMessage(message);
										ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
									}
								}
								if (queue.Handlers.Count == 0)
								{
									Thread.Sleep(500);
									_Model.BasicReject(deliveryTag, true);
									Interlocked.Decrement(ref _MessageHandlingCount);
									ApplicationEventLog.WriteEntry("Flow", string.Format("No handlers to process message {0}", consumerTag), System.Diagnostics.EventLogEntryType.Error);
								}
							}
							else
							{
								Thread.Sleep(500);
								_Model.BasicReject(deliveryTag, true);
								Interlocked.Decrement(ref _MessageHandlingCount);
								ApplicationEventLog.WriteEntry("Flow", string.Format("HandleBasicDeliver: Failed to locate queue {0}", consumerTag), System.Diagnostics.EventLogEntryType.Error);
							}
						}
					}
				}
				catch (System.Runtime.Serialization.SerializationException)
				{
					string path = GetBadMessageDirectory();
					File.WriteAllBytes(Path.Combine(path,string.Concat(consumerTag,"_", Guid.NewGuid().ToString())),body);
					_Model.BasicReject(deliveryTag, false);
					Interlocked.Decrement(ref _MessageHandlingCount);
				}
				catch (Exception ex)
				{
					Thread.Sleep(500);
					try
					{
						if (_Model != null)
							_Model.BasicReject(deliveryTag, true);
						Interlocked.Decrement(ref _MessageHandlingCount);
					}
					catch { }
					ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
				}
			}