/// <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()); } }
// 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); }