Exemple #1
0
        public async Task ExecuteAsync()
        {
            var groupedCandidates = _selector.GetCandidatesMethodsOfGroupNameGrouped(_serviceProvider);

            using (var scope = _serviceProvider.CreateScope())
            {
                var provider = scope.ServiceProvider;

                var messageStore        = provider.GetService <ICapMessageStore>();
                var nextReceivedMessage = await messageStore.GetNextReceivedMessageToBeExcuted();

                if (nextReceivedMessage != null && groupedCandidates.ContainsKey(nextReceivedMessage.Group))
                {
                    try
                    {
                        await messageStore.ChangeReceivedMessageStateAsync(nextReceivedMessage, StatusName.Processing);

                        // If there are multiple consumers in the same group, we will take the first
                        var executeDescriptor = groupedCandidates[nextReceivedMessage.Group][0];
                        var consumerContext   = new ConsumerContext(executeDescriptor, nextReceivedMessage.ToMessageContext());
                        var invoker           = _consumerInvokerFactory.CreateInvoker(consumerContext);
                        await invoker.InvokeAsync();

                        await messageStore.ChangeReceivedMessageStateAsync(nextReceivedMessage, StatusName.Succeeded);
                    }
                    catch (Exception ex)
                    {
                        _logger.ReceivedMessageRetryExecutingFailed(nextReceivedMessage.KeyName, ex);
                    }
                }
            }
        }
        protected virtual async Task <OperateResult> ExecuteSubscribeAsync(CapReceivedMessage receivedMessage)
        {
            try
            {
                var executeDescriptorGroup = _selector.GetTopicExector(receivedMessage.Name);

                if (!executeDescriptorGroup.ContainsKey(receivedMessage.Group))
                {
                    throw new SubscriberNotFoundException(receivedMessage.Name + " has not been found.");
                }

                // If there are multiple consumers in the same group, we will take the first
                var executeDescriptor = executeDescriptorGroup[receivedMessage.Group][0];
                var consumerContext   = new ConsumerContext(executeDescriptor, receivedMessage.ToMessageContext());

                await _consumerInvokerFactory.CreateInvoker(consumerContext).InvokeAsync();

                return(OperateResult.Success);
            }
            catch (SubscriberNotFoundException ex)
            {
                _logger.LogError("Can not be found subscribe method of name: " + receivedMessage.Name);
                return(OperateResult.Failed(ex));
            }
            catch (Exception ex)
            {
                _logger.ConsumerMethodExecutingFailed($"Group:{receivedMessage.Group}, Topic:{receivedMessage.Name}", ex);
                return(OperateResult.Failed(ex));
            }
        }
Exemple #3
0
        private void ProcessMessage(IServiceScope serviceScope, CapReceivedMessage receivedMessage)
        {
            var provider     = serviceScope.ServiceProvider;
            var messageStore = provider.GetRequiredService <ICapMessageStore>();

            try
            {
                var executeDescriptorGroup = _selector.GetTopicExector(receivedMessage.KeyName);

                if (executeDescriptorGroup.ContainsKey(receivedMessage.Group))
                {
                    messageStore.ChangeReceivedMessageStateAsync(receivedMessage, StatusName.Processing).Wait();

                    // If there are multiple consumers in the same group, we will take the first
                    var executeDescriptor = executeDescriptorGroup[receivedMessage.Group][0];
                    var consumerContext   = new ConsumerContext(executeDescriptor, receivedMessage.ToMessageContext());

                    _consumerInvokerFactory.CreateInvoker(consumerContext).InvokeAsync();

                    messageStore.ChangeReceivedMessageStateAsync(receivedMessage, StatusName.Succeeded).Wait();
                }
            }
            catch (Exception ex)
            {
                _logger.ConsumerMethodExecutingFailed($"Group:{receivedMessage.Group}, Topic:{receivedMessage.KeyName}", ex);
            }
        }
Exemple #4
0
        public void CreateInvokerTest()
        {
            var methodInfo = typeof(Sample).GetRuntimeMethods()
                             .Single(x => x.Name == nameof(Sample.ThrowException));

            var description = new ConsumerExecutorDescriptor
            {
                MethodInfo   = methodInfo,
                ImplTypeInfo = typeof(Sample).GetTypeInfo()
            };
            var messageContext = new MessageContext();

            var context = new ConsumerContext(description, messageContext);

            var invoker = consumerInvokerFactory.CreateInvoker(context);

            Assert.NotNull(invoker);
        }
Exemple #5
0
        public DefaultSubscriberExecutor(MethodMatcherCache selector,
                                         IConsumerInvokerFactory consumerInvokerFactory,
                                         ICallbackMessageSender callbackMessageSender,
                                         ILogger <DefaultSubscriberExecutor> logger)
        {
            _selector = selector;
            _callbackMessageSender = callbackMessageSender;
            _logger = logger;

            Invoker = consumerInvokerFactory.CreateInvoker();
        }
        public DefaultSubscriberExecutor(
            ILogger <DefaultSubscriberExecutor> logger,
            CapOptions options,
            IConsumerInvokerFactory consumerInvokerFactory,
            ICallbackMessageSender callbackMessageSender,
            IStateChanger stateChanger,
            IStorageConnection connection,
            MethodMatcherCache selector)
        {
            _selector = selector;
            _callbackMessageSender = callbackMessageSender;
            _options      = options;
            _stateChanger = stateChanger;
            _connection   = connection;
            _logger       = logger;

            Invoker = consumerInvokerFactory.CreateInvoker();
        }