Ejemplo n.º 1
0
        public async Task <IServiceResult> SendAsync(IInvokeMessage message)
        {
            var transportMessage = new TransportMessage <IInvokeMessage>
            {
                Id   = Guid.NewGuid().ToString("N"),
                Body = message
            };

            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace($"Sending message to node {Node}:\nMessage id:{transportMessage.Id}\nArgs:{Codec.ToJson(message.Args)}\n\n");
            }
            var tcs = new TaskCompletionSource <IServiceResult>(TaskCreationOptions.RunContinuationsAsynchronously);

            using (var ct = new CancellationTokenSource(UraganoOptions.Remoting_Invoke_CancellationTokenSource_Timeout.Value))
            {
                ct.Token.Register(() =>
                {
                    tcs.TrySetResult(new ServiceResult("Remoting invoke timeout!", RemotingStatus.Timeout));
                    Logger.LogWarning("Remoting invoke timeout,You can set the wait time with the Remoting_Invoke_CancellationTokenSource_Timeout option.\nSend to node:{1}\nMessage id:{0}\n\n", transportMessage.Id, Node);
                }, false);

                if (!_resultCallbackTask.TryAdd(transportMessage.Id, tcs))
                {
                    throw new Exception("Failed to send.");
                }
                try
                {
                    await Channel.WriteAndFlushAsync(transportMessage);

                    if (Logger.IsEnabled(LogLevel.Trace))
                    {
                        Logger.LogTrace($"Send completed, waiting for node {Node} to return results:\nMessage id:{transportMessage.Id}\n\n");
                    }
                    var result = await tcs.Task;
                    if (Logger.IsEnabled(LogLevel.Trace))
                    {
                        Logger.LogTrace($"The client received the return result of node {Node}:\nMessage id:{transportMessage.Id}\nBody:{Codec.ToJson(result)}\n\n");
                    }
                    return(result);
                }
                finally
                {
                    _resultCallbackTask.TryRemove(transportMessage.Id, out var t);
                    t?.TrySetCanceled();
                }
            }
        }
Ejemplo n.º 2
0
        public async Task <IServiceResult> SendAsync(IInvokeMessage message)
        {
            var transportMessage = new TransportMessage <IInvokeMessage>
            {
                Id   = Guid.NewGuid().ToString("N"),
                Body = message
            };

            if (Logger.IsEnabled(LogLevel.Debug))
            {
                Logger.LogTrace($"Sending message.[message id:{transportMessage.Id}]");
            }
            var tcs = new TaskCompletionSource <IServiceResult>(TaskCreationOptions.RunContinuationsAsynchronously);

            using (var ct = new CancellationTokenSource(UraganoOptions.Remoting_Invoke_CancellationTokenSource_Timeout.Value))
            {
                ct.Token.Register(() => { tcs.TrySetResult(new ServiceResult("Remoting invoke timeout!", RemotingStatus.Timeout)); }, false);
                if (!_resultCallbackTask.TryAdd(transportMessage.Id, tcs))
                {
                    throw new Exception("Failed to send.");
                }
                try
                {
                    await Channel.WriteAndFlushAsync(transportMessage);

                    if (Logger.IsEnabled(LogLevel.Debug))
                    {
                        Logger.LogTrace($"Send completed, waiting for results.[message id:{transportMessage.Id}]");
                    }
                    return(await tcs.Task);
                }
                finally
                {
                    _resultCallbackTask.TryRemove(transportMessage.Id, out var t);
                    t.TrySetCanceled();
                }
            }
        }