Exemplo n.º 1
0
        //public BasicMasstransitConsumer(IServiceProvider provider) { }

        async Task IConsumer <T> .Consume(ConsumeContext <T> context)
        {
            using (var scope = IocContext.Instance.Scope())
            {
                var logger = scope.ServiceProvider.Resolve_ <ILogger <BasicMasstransitConsumer <T> > >();

                var all_subscribers = scope.ServiceProvider.ResolveConsumerOptional <T>();
                foreach (var c in all_subscribers)
                {
                    try
                    {
#if DEBUG
                        logger.LogInformation($"消费:{context.Message?.ToJson()}");
#endif

                        var message = new BasicMessageConsumeContext <T>(context.Message);
                        await c.Consume(message);
                    }
                    catch (Exception e)
                    {
                        logger.AddErrorLog(e.Message, e);
                    }
                }
            }
        }
Exemplo n.º 2
0
        async Task __fetch_and_consume__()
        {
            var bs = (byte[])await this.redisDatabaseSelector.Database.ListRightPopAsync(this.config.QueueName);

            var model = ValidateHelper.IsNotEmpty(bs) ?
                        this.serializeProvider.DeserializeFromBytes <T>(bs) :
                        null;

            if (model == null)
            {
                await this.__wait__();

                return;
            }
            using var scope = this.provider.CreateScope();
            var all_subscribers = scope.ServiceProvider.ResolveConsumerOptional <T>();

            foreach (var c in all_subscribers)
            {
                try
                {
#if DEBUG
                    this.logger.LogInformation($"消费:{model.ToJson()}");
#endif

                    var message = new BasicMessageConsumeContext <T>(model);
                    await c.Consume(message);
                }
                catch (Exception e)
                {
                    this.logger.AddErrorLog(e.Message, e);
                }
            }
        }
Exemplo n.º 3
0
        public async Task PublishAsync <T>(string key, T model, CancellationToken cancellationToken) where T : class, IMessageBody
        {
            var consumers = this.provider.ResolveConsumerOptional <T>();

            foreach (var c in consumers)
            {
                try
                {
                    var message = new BasicMessageConsumeContext <T>(model);
                    await c.Consume(message);
                }
                catch (Exception e)
                {
                    this.logger.AddErrorLog(e.Message, e);
                }
            }
        }
Exemplo n.º 4
0
        public override async Task OnMessageReceived(IMessageConsumeContext <MessageType> message)
        {
            var model = message.Message;

            using var s = this.provider.CreateScope();
            var consumers = s.ServiceProvider.ResolveConsumerOptional <MessageType>();

            foreach (var c in consumers)
            {
#if DEBUG
                this.logger.LogInformation($"消费:{model.ToJson()}");
#endif

                var data = new BasicMessageConsumeContext <MessageType>(model);
                await c.Consume(data);
            }
        }
Exemplo n.º 5
0
        public override async Task <bool> OnMessageReceived(ConsumerMessage <T> message)
        {
            using var s = this.provider.CreateScope();
            var consumers = s.ServiceProvider.ResolveConsumerOptional <T>();

            var model = message.MessageModel;

            foreach (var c in consumers)
            {
#if DEBUG
                this.logger.LogInformation($"消费:{model.ToJson()}");
#endif

                var data = new BasicMessageConsumeContext <T>(model);
                await c.Consume(data);
            }

            return(true);
        }
Exemplo n.º 6
0
        public RabbitMqConsumerBase(IServiceProvider provider, ILogger logger, IConnection connection, ConsumeOption option)
        {
            provider.Should().NotBeNull();
            logger.Should().NotBeNull();
            connection.Should().NotBeNull();
            option.Should().NotBeNull();

            this.provider = provider;
            this.logger   = logger;
            this._option  = option;

            this._serializer = provider.ResolveSerializer();
            this._channel    = connection.CreateModel();

            //qos
            if (this._option.ConcurrencySize != null)
            {
                this._channel.BasicQos(prefetchSize: 0, prefetchCount: this._option.ConcurrencySize.Value, global: false);
            }

            //异步消费
            this._consumer = new AsyncEventingBasicConsumer(this._channel);

            //注册消费事件
            this._consumer.Received += async(sender, args) =>
            {
                using var s = this.provider.CreateScope();

                var body = this.__deserialize__(args.Body.ToArray());
                if (body == null)
                {
                    return;
                }
                var context = new BasicMessageConsumeContext <T>(body);
                if (!this._option.AutoAck)
                {
                    context.AckHandler = async(success) =>
                    {
                        if (success)
                        {
                            this._channel.BasicAck(args.DeliveryTag, multiple: true);
                        }
                        else
                        {
                            this._channel.BasicNack(args.DeliveryTag, multiple: true, requeue: true);
                        }
                        await Task.CompletedTask;
                    };
                }

                try
                {
                    await this.OnMessageReceived(context);

                    await context.Ack(true);
                }
                catch (Exception e)
                {
                    //log errors
                    this.logger.AddErrorLog($"rabbitmq消费发生异常:{e.Message}", e);
                    await context.Ack(false);
                }
            };
        }