private void RegisterMessageProcessor(IConsumerClient client) { client.OnMessageReceived += async (sender, transportMessage) => { _logger.MessageReceived(transportMessage.GetId(), transportMessage.GetName()); long? tracingTimestamp = null; try { tracingTimestamp = TracingBefore(transportMessage, _serverAddress); var name = transportMessage.GetName(); var group = transportMessage.GetGroup(); Message message; var canFindSubscriber = _selector.TryGetTopicExecutor(name, group, out var executor); try { if (!canFindSubscriber) { var error = $"Message can not be found subscriber. Name:{name}, Group:{group}. {Environment.NewLine} see: https://github.com/dotnetcore/CAP/issues/63"; var ex = new SubscriberNotFoundException(error); TracingError(tracingTimestamp, transportMessage, client.BrokerAddress, ex); throw ex; } var type = executor.Parameters.FirstOrDefault(x => x.IsFromCap == false)?.ParameterType; message = await _serializer.DeserializeAsync(transportMessage, type); } catch (Exception e) { transportMessage.Headers.Add(Headers.Exception, nameof(SerializationException) + "-->" + e.Message); if (transportMessage.Headers.TryGetValue(Headers.Type, out var val)) { var dataUri = $"data:{val};base64," + Convert.ToBase64String(transportMessage.Body); message = new Message(transportMessage.Headers, dataUri); } else { var dataUri = "data:UnknownType;base64," + Convert.ToBase64String(transportMessage.Body); message = new Message(transportMessage.Headers, dataUri); } } if (message.HasException()) { var content = StringSerializer.Serialize(message); _storage.StoreReceivedExceptionMessage(name, group, content); client.Commit(sender); try { _options.FailedThresholdCallback?.Invoke(new FailedInfo { ServiceProvider = _serviceProvider, MessageType = MessageType.Subscribe, Message = message }); _logger.ConsumerExecutedAfterThreshold(message.GetId(), _options.FailedRetryCount); } catch (Exception e) { _logger.ExecutedThresholdCallbackFailed(e); } TracingAfter(tracingTimestamp, transportMessage, _serverAddress); } else { var mediumMessage = _storage.StoreReceivedMessage(name, group, message); mediumMessage.Origin = message; client.Commit(sender); TracingAfter(tracingTimestamp, transportMessage, _serverAddress); _dispatcher.EnqueueToExecute(mediumMessage, executor); } } catch (Exception e) { _logger.LogError(e, "An exception occurred when process received message. Message:'{0}'.", transportMessage); client.Reject(sender); TracingError(tracingTimestamp, transportMessage, client.BrokerAddress, e); } }; client.OnLog += WriteLog; }