Exemplo n.º 1
0
        private IByteBuffer GetByteBuffer(TransportMsg message)
        {
            var         data   = LZ4MessagePackSerializer.FromJson(_serializer.Serialize <string>(message));
            IByteBuffer buffer = Unpooled.Buffer(data.Length, data.Length);

            return(buffer.WriteBytes(data));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task <RemoteCallBackData> SendAsync(RemoteCallData data)
        {
            try
            {
                data.ServiceId = data.ServiceId.ToLower();
                TransportMsg transportMsg = new TransportMsg()
                {
                    Content     = data,
                    ContentType = data.GetType().ToString()
                };
                Task <RemoteCallBackData> callbackTask = RegisterResultCallbackAsync(transportMsg.Id);
                try
                {
                    await _sender.SendAsync(transportMsg);

                    return(await callbackTask);
                }
                catch (Exception ex)
                {
                    _logger.Error($"当连接服务端时发生错误, serviceid: {data.ServiceId}", ex);
                    throw;
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"传输失败,serviceid: {data.ServiceId}", ex);
                throw;
            }
        }
Exemplo n.º 3
0
        public RemoteExecutorContext(TransportMsg transportMessage, IServiceEntryContainer serviceEntryContainer,
                                     IResponse response, ISerializer serializer, ILogger logger, IServiceDiscovery serviceDiscovery)
        {
            Response         = response;
            TransportMessage = transportMessage;
            try
            {
                RemoteInvokeMessage = transportMessage.GetContent <RemoteCallData>(serializer);
            }
            catch (Exception ex)
            {
                logger.Error("failed to convert transportmsg.content to  RemoteCallerData.", ex);
                return;
            }

            ServiceEntry = serviceEntryContainer.GetServiceEntry()
                           .FirstOrDefault(x => x.Descriptor.Id == RemoteInvokeMessage.ServiceId);
            ServiceDesc serviceDesc;

            if (ServiceEntry == null)
            {
                logger.Warn($"not found service: {RemoteInvokeMessage.ServiceId}");
                List <ServiceRoute> router = serviceDiscovery.GetRoutesAsync().Result;
                serviceDesc = router.FirstOrDefault(o => o.ServiceDescriptor.Id == RemoteInvokeMessage.ServiceId).ServiceDescriptor;
            }
            else
            {
                serviceDesc = ServiceEntry.Descriptor;
            }

            RemoteInvokeMessage.Parameters = CheckParameters(RemoteInvokeMessage.Parameters, serviceDesc, serializer);
        }
Exemplo n.º 4
0
 public override void ChannelRead(IChannelHandlerContext context, object message)
 {
     Task.Run(() =>
     {
         TransportMsg msg = message as TransportMsg;
         _readAction(context, msg);
     });
 }
Exemplo n.º 5
0
        public override void ChannelRead(IChannelHandlerContext context, object message)
        {
            TransportMsg msg = message as TransportMsg;

            IClientListener listener = context.Channel.GetAttribute(AttributeKey <IClientListener> .ValueOf(typeof(DefaultTransportClientFactory), nameof(IClientListener))).Get();
            IClientSender   sender   = context.Channel.GetAttribute(AttributeKey <IClientSender> .ValueOf(typeof(DefaultTransportClientFactory), nameof(IClientSender))).Get();

            listener.Received(sender, msg);
        }
Exemplo n.º 6
0
        public async Task Received(IClientSender sender, TransportMsg message)
        {
            if (OnReceived == null)
            {
                return;
            }

            await OnReceived(sender, message);
        }
Exemplo n.º 7
0
        private async Task <RemoteCallBackData> RegisterResultCallbackAsync(string id)
        {
            TaskCompletionSource <TransportMsg> task = new TaskCompletionSource <TransportMsg>();

            _resultCallbackDic.TryAdd(id, task);
            try
            {
                TransportMsg result = await task.Task;
                return(result.GetContent <RemoteCallBackData>(_serializer));
            }
            finally
            {
                _resultCallbackDic.TryRemove(id, out _);
            }
        }
Exemplo n.º 8
0
        private Task ListenerOnReceived(IClientSender sender, TransportMsg message)
        {
            _logger.Debug($"收到消息,消息id: {message.Id}");

            if (!_resultCallbackDic.TryGetValue(message.Id, out TaskCompletionSource <TransportMsg> task))
            {
                return(Task.CompletedTask);
            }

            if (message.ContentType != typeof(RemoteCallBackData).FullName)
            {
                return(Task.CompletedTask);
            }

            task.SetResult(message);
            return(Task.CompletedTask);
        }
Exemplo n.º 9
0
        private async Task OnReceived(IChannelHandlerContext channel, TransportMsg message)
        {
            _logger.Debug($"开始触发服务: {message.Id}");
            if (message.ContentType == typeof(RemoteCallData).FullName)
            {
                IResponse             response    = new RpcResponse(channel, _serializer, _logger);
                RemoteExecutorContext thisContext = new RemoteExecutorContext(message, _serviceEntryContainer, response, _serializer, _logger, _serviceDiscovery);

                RequestDel lastInvoke = new RequestDel(async context =>
                {
                    RemoteCallBackData resultMessage = new RemoteCallBackData();
                    if (context.ServiceEntry == null)
                    {
                        resultMessage.ExceptionMessage = $"没有此服务:{context.RemoteInvokeMessage.ServiceId}";
                        await response.WriteAsync(message.Id, resultMessage);
                    }
                    else if (context.ServiceEntry.Descriptor.WaitExecution)
                    {
                        await LocalServiceExecuteAsync(context, resultMessage);
                        await response.WriteAsync(message.Id, resultMessage);
                    }
                    else
                    {
                        await response.WriteAsync(message.Id, resultMessage);
                        await Task.Factory.StartNew(async() =>
                        {
                            await LocalServiceExecuteAsync(context, resultMessage);
                        });
                    }
                });

                foreach (Func <RequestDel, RequestDel> middleware in _middlewares)
                {
                    lastInvoke = middleware.Invoke(lastInvoke);
                }
                await lastInvoke.Invoke(thisContext);
            }
            else
            {
                _logger.Debug($"msg: {message.Id}, message type is not an  RemoteCallData.");
            }
        }
Exemplo n.º 10
0
 public async Task WriteAsync(string messageId, RemoteCallBackData resultMessage)
 {
     try
     {
         _logger.Debug($"结束处理任务: {messageId}");
         TransportMsg transportMsg = new TransportMsg
         {
             Id          = messageId,
             Content     = resultMessage,
             ContentType = resultMessage.GetType().ToString()
         };
         var         data   = LZ4MessagePackSerializer.FromJson(_serializer.Serialize <string>(transportMsg));
         IByteBuffer buffer = Unpooled.Buffer(data.Length, data.Length);
         buffer.WriteBytes(data);
         await _channel.WriteAndFlushAsync(buffer);
     }
     catch (Exception ex)
     {
         _logger.Error("抛出错误 消息为: " + messageId, ex);
     }
 }
Exemplo n.º 11
0
 public async Task SendAsync(TransportMsg message)
 {
     IByteBuffer buffer = GetByteBuffer(message);
     await _channel.WriteAndFlushAsync(buffer);
 }