Example #1
0
        /// <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(ResponseMessage message, RequestReceivedEventArgs e)
        {
            if (e.ResponseQueues?.Any() != true)
            {
                return(-1);
            }

            var senderOptions = Config.ResponseOptions.ServerSenderOptions;

            if (senderOptions is null)
            {
                throw new NullReferenceException("ServerSenderOptions is null.");
            }

            var data = SenderSerializer.Serialize(message);
            var body = RedisQueueClient.CreateMessageBody(data, message.CorrelationId);

            var response = true;

            foreach (var queue in e.ResponseQueues)
            {
                try
                {
                    var producer   = _rQueue.GetOrAdd(queue.Route, _ => new RedisMQConnection(queue));
                    var subscriber = await producer.GetSubscriberAsync().ConfigureAwait(false);

                    Core.Log.LibVerbose("Sending {0} bytes to the Queue '{1}/{2}' with CorrelationId={3}", data.Count, queue.Route, queue.Name, message.CorrelationId);
                    await subscriber.PublishAsync(queue.Name, body).ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    response = false;
                    Core.Log.Write(ex);
                }
            }
            var length = data.Count;

            data.ReturnContentToPoolAndDispose();
            return(response ? length : -1);
        }