public void ProcessRquestData(byte[] data, TaskCompletionSource <Message> responseRawDataAvailableTcs, TaskCompletionSource <object> responseSentTcs)
        {
            var           applicationMessage = _messageFactory.CreateApplicationMessage(data);
            IInboundReply reply = null;

            var messageAvailable = applicationMessage.Message != null;

            reply = _replyFactory.CreateIInboundReply(responseRawDataAvailableTcs, responseSentTcs);

            var circuitBreaker = _policyRegistry.Get <CircuitBreakerPolicy <Message> >(applicationMessage.Backend);

            var policy = Policy.HandleResult <Message>(r => r.IsFault).
                         Fallback(applicationMessage.Message, (x) =>
            {
                reply.Reply(applicationMessage.ErrorMessage, TimeSpan.FromSeconds(1));
            }).Wrap(circuitBreaker);

            policy.Execute(() =>
            {
                if (messageAvailable)
                {
                    _inboundQueue.Enqueue(new Tuple <bool, Message, IInboundReply>(messageAvailable, applicationMessage.Message, reply));
                }

                return(applicationMessage.Message);
            });
        }
示例#2
0
        public async Task StartServerAsync()
        {
            _tcpServer.FrameArrived += async(s, e) =>
            {
                var applicationMessage = _messageFactory.CreateApplicationMessage(e.FrameData);

                var reply = _replyFactory.CreateIInboundReply(new TaskCompletionSource <Message>(), new TaskCompletionSource <object>()) as ApplicationReply;

                _tcpQueue.Enqueue(new Tuple <bool, Message, IInboundReply>(true, applicationMessage.Message, reply));

                var responseMessage = await reply.ResponseAvailableTaskCompletionSource.Task;

                await e.RemoteTcpPeer.SendAsync(responseMessage.GetReaderAtBodyContents().ReadInnerXml().Map(Encoding.ASCII.GetBytes));

                reply.ResponseSentTaskCompletionSource.TrySetResult(null);

                e.RemoteTcpPeer.Disconnect(AsyncNet.Tcp.Connection.ConnectionCloseReason.LocalShutdown);
            };

            await _tcpServer.StartAsync(_cts.Token);
        }