internal void AddAckMessageInfo(Guid deliveryID, AckMessageInfo ackMessageInfo) { lock (Messages) { Messages.Add(deliveryID, ackMessageInfo); } }
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); } }
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); } }
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); } }