Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
 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);
         }
     }
 }
Ejemplo n.º 3
0
        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();
            }
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
 public bool RequeueMessageItem(RQChannel rabbitMqChannel, string messageIdentifier)
 {
     rabbitMqChannel.Channel.BasicReject(Convert.ToUInt32(messageIdentifier), true);
     rabbitMqChannel.Dispose();
     return true;
 }
Ejemplo n.º 6
0
 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;
 }
Ejemplo n.º 7
0
 public bool DeleteMessageItem(RQChannel rabbitMqChannel, string messageIdentifier)
 {
     rabbitMqChannel.Channel.BasicAck(Convert.ToUInt32(messageIdentifier), false);
     rabbitMqChannel.Dispose();
     return true;
 }