예제 #1
0
        public object GetValue()
        {
            if (disposedValue)
            {
                ThrowDisposedValue();
            }
            if (_data == MultiArray <byte> .Empty)
            {
                return(null);
            }
            var type = string.IsNullOrWhiteSpace(_dataType) ? typeof(object) : Core.GetType(_dataType, false);

            if (string.IsNullOrWhiteSpace(_serializerMimeType))
            {
                if (type == typeof(byte[]))
                {
                    return(_data.AsArray());
                }
                if (type == typeof(MultiArray <byte>))
                {
                    return(_data);
                }
                return(null);
            }
            var serializer = SerializerCache.GetOrAdd(_serializerMimeType, smt => CreateSerializer(smt));
            var value      = serializer.Deserialize(_data, type ?? typeof(object));

            return(value);
        }
예제 #2
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(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);
        }