Esempio n. 1
0
    public Task Setup(IMessageBusClient client)
    {
        try
        {
            //Create a disposable queue
            var queueName = client.Channel.QueueDeclare(Name, true, false, false).QueueName;

            client.Channel.BasicQos(0, 1, false);

            //Bind it to the exchange
            client.Channel.QueueBind(queueName, Exchange, Key);

            var consumer = new EventingBasicConsumer(client.Channel);
            consumer.Received += async(model, ea) =>
            {
                try
                {
                    using var scope = _services.CreateScope();
                    var messageJson = Encoding.UTF8.GetString(ea.Body.ToArray());

                    var message = messageJson.FromJson <T1>();

                    var response = await ProcessMessage(scope.ServiceProvider, message);

                    var responseJson = response.ToJson();

                    var responseData = Encoding.UTF8.GetBytes(responseJson);

                    //Send result
                    var replyProps = client.Channel.CreateBasicProperties();
                    replyProps.CorrelationId = ea.BasicProperties.CorrelationId;

                    client.Channel.BasicPublish("", ea.BasicProperties.ReplyTo, replyProps, responseData);

                    client.Channel.BasicAck(ea.DeliveryTag, false);
                }
                catch (Exception exc)
                {
                    var body = ea.Body.ToArray();

                    Logger.LogError(exc, "RabbitMQ Message Failed => {name} => {message}", Name, Encoding.UTF8.GetString(body));

                    client.Channel.BasicNack(ea.DeliveryTag, false, false);

                    client.SendError(body, ea.RoutingKey);
                }
            };
            client.Channel.BasicConsume(queueName, false, consumer);
        }
        catch (Exception exc)
        {
            Logger.LogError(exc, "Error setting up message bus listener (rpc) {name}", Name);
        }

        return(Task.CompletedTask);
    }
Esempio n. 2
0
    /// <summary>
    /// Set up the message bus listener
    /// </summary>
    /// <param name="client"></param>
    /// <returns></returns>
    public Task Setup(IMessageBusClient client)
    {
        try
        {
            //Create a disposable queue
            var queueName = client.Channel.QueueDeclare(Name, true, false, false).QueueName;

            client.Channel.BasicQos(0, 1, false);

            //Bind it to the exchange
            client.Channel.QueueBind(queueName, Exchange, Key);

            var consumer = new EventingBasicConsumer(client.Channel);
            consumer.Received += async(model, ea) =>
            {
                try
                {
                    using var scope = _services.CreateScope();
                    var message = Encoding.UTF8.GetString(ea.Body.ToArray());

                    var item = message.FromJson <T>();

                    await ProcessMessage(scope.ServiceProvider, item);

                    client.Channel.BasicAck(ea.DeliveryTag, false);
                }
                catch (Exception exc)
                {
                    var body = ea.Body.ToArray();

                    Logger.LogTrace(exc, "RabbitMQ Message Failed => {name} => {message}", Name, Encoding.UTF8.GetString(body));

                    client.Channel.BasicNack(ea.DeliveryTag, false, false);

                    client.SendError(body, ea.RoutingKey);
                }
            };
            client.Channel.BasicConsume(queueName, false, consumer);
        }
        catch (Exception exc)
        {
            Logger.LogError(exc, "Error setting up message bus listener => {name}", Name);
        }

        return(Task.CompletedTask);
    }