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); }); }
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); }