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