private async Task ProcessingTaskAsync(Message message) { try { var(correlationId, name) = KafkaQueueRawClient.GetFromRawMessageHeader(message.Key); var body = message.Value; Core.Log.LibVerbose("Received {0} bytes from the Queue '{1}/{2}'", body.Length, Connection.Route, Connection.Name); Counters.IncrementTotalReceivingBytes(body.Length); if (ResponseServer) { var evArgs = new RawResponseReceivedEventArgs(_name, body, correlationId, body.Length) { Metadata = { ["ReplyTo"] = name } }; await OnResponseReceivedAsync(evArgs).ConfigureAwait(false); } else { var evArgs = new RawRequestReceivedEventArgs(_name, Connection, body, correlationId, body.Length) { Metadata = { ["ReplyTo"] = name } }; await OnRequestReceivedAsync(evArgs).ConfigureAwait(false); } Counters.IncrementTotalMessagesProccesed(); } catch (Exception ex) { Counters.IncrementTotalExceptions(); Core.Log.Write(ex); } }
/// <inheritdoc /> /// <summary> /// On Send message data /// </summary> /// <param name="message">Response message instance</param> /// <param name="e">Event Args</param> protected override async Task <int> OnSendAsync(MultiArray <byte> message, RawRequestReceivedEventArgs e) { var queues = e.ResponseQueues; var replyTo = e.Metadata["ReplyTo"] ?? string.Empty; queues.Add(new MQConnection { Route = e.Sender.Route, Parameters = e.Sender.Parameters }); var senderOptions = Config.ResponseOptions.ServerSenderOptions; if (senderOptions is null) { throw new NullReferenceException("ServerSenderOptions is null."); } var header = KafkaQueueRawClient.CreateRawMessageHeader(e.CorrelationId, replyTo); var body = message.AsArray(); var response = true; foreach (var queue in e.ResponseQueues) { try { var producer = _rQueue.GetOrAdd(queue.Route, qRoute => { Core.Log.LibVerbose("New Producer from QueueClient"); if (string.IsNullOrEmpty(qRoute)) { throw new UriFormatException($"The route for the connection to {qRoute} is null."); } var options = new KafkaOptions(new Uri(qRoute)); var router = new BrokerRouter(options); return(Extensions.InvokeWithRetry(() => new Producer(router), 5000, int.MaxValue).WaitAsync()); }); if (!string.IsNullOrEmpty(replyTo)) { if (string.IsNullOrEmpty(queue.Name)) { Core.Log.LibVerbose("Sending {0} bytes to the Queue '{1}/{2}' with CorrelationId={3}", body.Length, queue.Route, replyTo, e.CorrelationId); await producer.SendMessageAsync(replyTo, new[] { new Message { Key = header, Value = body } }).ConfigureAwait(false); } else if (queue.Name.StartsWith(replyTo, StringComparison.Ordinal)) { Core.Log.LibVerbose("Sending {0} bytes to the Queue '{1}/{2}' with CorrelationId={3}", body.Length, queue.Route, queue.Name + "_" + replyTo, e.CorrelationId); await producer.SendMessageAsync(queue.Name + "_" + replyTo, new[] { new Message { Key = header, Value = body } }).ConfigureAwait(false); } } else { Core.Log.LibVerbose("Sending {0} bytes to the Queue '{1}/{2}' with CorrelationId={3}", body.Length, queue.Route, queue.Name, e.CorrelationId); await producer.SendMessageAsync(queue.Name, new[] { new Message { Key = header, Value = body } }).ConfigureAwait(false); } } catch (Exception ex) { response = false; Core.Log.Write(ex); } } return(response ? message.Count : -1); }