public object BasicConsume(out RQChannel rabbitMqChannel, out long messageCount, bool ack, out string messageId) { messageId = string.Empty; object messageItem = null; messageCount = 0; Connection = RQConnection.GetConnection(); rabbitMqChannel = new RQChannel(Connection); BasicGetResult eventArgs; eventArgs = rabbitMqChannel.Channel.BasicGet(QueueName, !ack); if (eventArgs != null) { byte[] message = eventArgs.Body; var binaryFormatter = new BinaryFormatter(); var memoryStream = new MemoryStream(); memoryStream.Write(message, 0, message.Length); memoryStream.Seek(0, SeekOrigin.Begin); messageItem = binaryFormatter.Deserialize(memoryStream); messageId = eventArgs.DeliveryTag.ToString(CultureInfo.InvariantCulture); //Id must not be changed or lost in any case messageCount = eventArgs.MessageCount; } if (eventArgs == null || !ack) { rabbitMqChannel.Dispose(); rabbitMqChannel = null; } return messageItem; }
public MessageHandler(string exchangeName, string exchangeType, string queueName, string consumeRoutingKey) { Connection = RQConnection.GetConnection(); using (RQChannel rabbitMqChannel = new RQChannel(Connection)) { if (!string.IsNullOrEmpty(queueName)) { QueueName = queueName; rabbitMqChannel.Channel.QueueDeclare(QueueName, true, false, false, null); //string queue, bool durable, bool exclusive, bool autoDelete, IDictionary<string, object> arguments } if (!string.IsNullOrEmpty(exchangeName) && !string.IsNullOrEmpty(exchangeType)) { ExchangeName = exchangeName; rabbitMqChannel.Channel.ExchangeDeclare(exchangeName, exchangeType); if (!string.IsNullOrEmpty(consumeRoutingKey) && !string.IsNullOrEmpty(queueName)) rabbitMqChannel.Channel.QueueBind(queueName, ExchangeName, consumeRoutingKey); } } }
public void Start() { MessageItem baseMessageItem = null; try { while (IsActive) { baseMessageItem = ConsumeMessageItem(); if (baseMessageItem != null && !string.IsNullOrEmpty(baseMessageItem.RoutingKey) && !string.IsNullOrEmpty(baseMessageItem.MessageId) && !baseMessageItem.IsExit) { _sleepTime = 5000; MessageItem processedItem = null; var isExceptionOccurred = false; try { processedItem = ProcessMessageItem(baseMessageItem); } catch (StopProcessingException) { throw; } catch (Exception ex) { Logger.LogException(ex, _source, "Start", Severity.Critical); if (processedItem == null) { processedItem = new MessageItem() { MessageId = baseMessageItem.MessageId, IsExit = true }; } isExceptionOccurred = true; } finally { if (processedItem == null) processedItem = new MessageItem() { MessageId = baseMessageItem.MessageId, RoutingKey = baseMessageItem.RoutingKey }; processedItem.StackTrace = processedItem.StackTrace ?? new List<string>(); processedItem.StackTrace.Add(GetType().Name); if (isExceptionOccurred) Logger.LogFailedMessage(baseMessageItem); processedItem.RoutingKey = PublishRoutingKey; } if (processedItem.MessageId != baseMessageItem.MessageId) { throw new Exception("Process method returned an Invalid QueueItem. MessageId Do not match."); } if (processedItem.IsExit || PublishProcessedItem(processedItem)) { ConsumeHandler.DeleteMessageItem(RabbitMqChannel, baseMessageItem.MessageId); } else { ConsumeHandler.RequeueMessageItem(RabbitMqChannel, processedItem.MessageId); } _rabbitMqChannel = null; } else if (baseMessageItem != null) { throw new Exception("Invalid QueueItem. Does not contain complete information."); } else // If no message in the queue then wait for some time { if (IsActive) Sleep(); } } } catch (StopProcessingException processingException) { processingException.Data["Message"] = "Message to stop execution received from task."; Logger.LogException(processingException, _source, "Start",Severity.Critical); } catch (Exception ex) { Logger.LogException(ex, _source, "Start", Severity.Critical); if (baseMessageItem != null) { baseMessageItem.IsExit = true; } } finally { _taskWaitHandle.Close(); _stopWaitHandle.Set(); } }
public MessageItem Consume(out RQChannel rabbitMqChannel, out long messageCount, bool ack) { MessageItem messageItem = null; messageCount = 0; Connection = RQConnection.GetConnection(); rabbitMqChannel = new RQChannel(Connection); // QueueingBasicConsumer Consumer = new QueueingBasicConsumer(rabbitMqChannel.Channel); //rabbitMqChannel.Channel.BasicConsume(QueueName, false, Consumer); //BasicDeliverEventArgs eventArgs; //Consumer.Queue.Dequeue(5000, out eventArgs); //Timeout is essential BasicGetResult eventArgs; eventArgs = rabbitMqChannel.Channel.BasicGet(QueueName, !ack); //Channel.BasicGet(string queue,bool noAck) if (eventArgs != null) { String jsonified = Encoding.UTF8.GetString(eventArgs.Body); var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects, }; messageItem = JsonConvert.DeserializeObject<MessageItem>(jsonified, settings); messageItem.MessageId = eventArgs.DeliveryTag.ToString(CultureInfo.InvariantCulture); //Id must not be changed or lost in any case messageCount = eventArgs.MessageCount; } if (eventArgs == null || !ack) { rabbitMqChannel.Dispose(); rabbitMqChannel = null; } return messageItem; }
public bool RequeueMessageItem(RQChannel rabbitMqChannel, string messageIdentifier) { rabbitMqChannel.Channel.BasicReject(Convert.ToUInt32(messageIdentifier), true); rabbitMqChannel.Dispose(); return true; }
public bool Publish(MessageItem item) { var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects, }; String jsonified = JsonConvert.SerializeObject(item, settings); byte[] message = Encoding.UTF8.GetBytes(jsonified); Connection = RQConnection.GetConnection(); using (RQChannel rabbitMqChannel = new RQChannel(Connection)) { if (string.IsNullOrEmpty(ExchangeName)) rabbitMqChannel.Channel.BasicPublish(string.Empty, QueueName, true, false, rabbitMqChannel.BasicProperties, message); else rabbitMqChannel.Channel.BasicPublish(ExchangeName, item.RoutingKey, true, false, rabbitMqChannel.BasicProperties, message); //string exchange, string routingKey, bool mandatory, bool immediate, IBasicProperties basicProperties, byte[] body } return true; }
public bool DeleteMessageItem(RQChannel rabbitMqChannel, string messageIdentifier) { rabbitMqChannel.Channel.BasicAck(Convert.ToUInt32(messageIdentifier), false); rabbitMqChannel.Dispose(); return true; }