/// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queueDataModels">Herhangi bir tipte gönderilebilir where koşullaırına uyan</param>
        /// <param name="queueName">Queue kuyrukta hangi isimde tutulacağı bilgisi operasyon istek zamanı gönderilebilir.</param>
        public void Enqueue <T>(IEnumerable <T> queueDataModels, string queueName) where T : class, new()
        {
            try
            {
                var _connection = _rabbitMQServices.GetConnection();
                using (var _channel = _rabbitMQServices.GetModel(_connection))
                {
                    _channel.QueueDeclare(queue: queueName,
                                          durable: true,     // ile in-memory mi yoksa fiziksel olarak mı saklanacağı belirlenir.
                                          exclusive: false,  // yalnızca bir bağlantı tarafından kullanılır ve bu bağlantı kapandığında sıra silinir - özel olarak işaretlenirse silinmez
                                          autoDelete: false, // en son bir abonelik iptal edildiğinde en az bir müşteriye sahip olan kuyruk silinir
                                          arguments: null);  // isteğe bağlı; eklentiler tarafından kullanılır ve TTL mesajı, kuyruk uzunluğu sınırı, vb.

                    var properties = _channel.CreateBasicProperties();
                    properties.Persistent = true;
                    properties.Expiration = RabbitMQConsts.MessagesTTL.ToString();

                    foreach (var queueDataModel in queueDataModels)
                    {
                        var body = Encoding.UTF8.GetBytes(_objectConvertFormat.ObjectToJson(queueDataModel));
                        _channel.BasicPublish("", queueName, false, basicProperties: properties, body: body);
                    }
                }
            }
            catch (Exception ex)
            {
                //loglama yapılabilir
                throw new Exception(ex.InnerException.Message.ToString());
            }
        }
Exemple #2
0
        // Mesaj almaya başlanır
        public void Start()
        {
            try
            {
                _semaphore = new SemaphoreSlim(RabbitMQConsts.ParallelThreadsCount);

                var factory = new ConnectionFactory()
                {
                    HostName = _rabbitMQConfiguration.HostName
                };
                _connection = _rabbitMQServices.GetConnection();
                _channel    = _connection.CreateModel();
                _channel.QueueDeclare(queue: RabbitMQConsts.RabbitMqConstsList.QueueNameEmail.ToString(),
                                      durable: true,
                                      exclusive: false,
                                      autoDelete: false,
                                      arguments: null);

                _channel.BasicQos(0, RabbitMQConsts.ParallelThreadsCount, false);
                _consumer           = new EventingBasicConsumer(_channel);
                _consumer.Received += Consumer_Received;
                _channel.BasicConsume(queue: RabbitMQConsts.RabbitMqConstsList.QueueNameEmail.ToString(),
                                      autoAck: false,            /* bir mesajı aldıktan sonra bunu anladığına
                                                                  * dair(acknowledgment) kuyruğa bildirimde bulunur ya da timeout gibi vakalar oluştuğunda
                                                                  * mesajı geri çevirmek(Discard) veya yeniden kuyruğa aldırmak(Re-Queue) için dönüşler yapar*/
                                      consumer: _consumer);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message.ToString());
            }
        }
        private static async Task ReceiveMessages()
        {
            var connection = await RabbitMQService.GetConnection();

            var channel = connection.CreateModel();

            var queue = channel.QueueDeclare(QueueName.Name1.ToString(), true, false, false, null);

            string consumedMessage;
            var    consumer = new AsyncEventingBasicConsumer(channel);

            consumer.Received += async(model, ea) =>
            {
                try
                {
                    var body = ea.Body;
                    consumedMessage = Encoding.UTF8.GetString(body.ToArray());

                    var result = await ProcessMessage(consumedMessage);

                    if (result.IsSuccess)
                    {
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                    else if (ea.Redelivered)
                    {
                        channel.BasicAck(ea.DeliveryTag, false);
                        //Tekrar mesaj receive edilmesine rağmen işlenemedi. Kuyruğu tıkamaması için ack edildi.
                    }
                    else
                    {
                        channel.BasicNack(ea.DeliveryTag, false, true); // mesaj işlenirken hata oluştu, tekrar queueya alınsın.
                    }
                }
                catch (Exception ex)
                {
                    try
                    {
                        if (ea.Redelivered)
                        {
                            channel.BasicAck(ea.DeliveryTag, false);
                        }
                        else
                        {
                            channel.BasicNack(ea.DeliveryTag, false, true);
                        }
                    }
                    catch (Exception ex2)
                    {
                        throw;
                    }
                }
            };

            channel.BasicQos(0, 1, false);
            consumedMessage = channel.BasicConsume(queue: QueueName.Name1.ToString(), autoAck: false, consumer: consumer);
        }