예제 #1
0
        private void InvokeOneWayMethod(IRequestContext context, object[] args, ContextChain chain)
        {
            Task.Run(() =>
            {
                // invoke method
                var invokeFuture = InvokeMethod(context, args);
                invokeFuture.ContinueWith(t =>
                {
                    if (t.Exception != null)
                    {
                        _logger.LogError(new EventId(0, "Thrift"), t.Exception, $"An error occurred execute method {_method.Name}[{_method.DeclaringType?.FullName}].");
                    }

                    chain.Done();
                });
            });
        }
예제 #2
0
        public Task <Boolean> Process(TProtocol inProtocol, TProtocol outProtocol, int sequenceId, ContextChain contextChain)
        {
            // read args
            contextChain.PreRead();
            Object[] args = ReadArguments(inProtocol);
            contextChain.PostRead(args);
            IRequestContext requestContext = RequestContexts.GetCurrentContext();

            inProtocol.ReadMessageEnd();
            if (!_oneway)
            {
                // invoke method
                var invokeFuture = InvokeMethod(requestContext, args);
                return(CompleteMethodInvoke(invokeFuture, outProtocol, sequenceId, contextChain, requestContext).ContinueWith(t =>
                {
                    contextChain.Done();
                    return t.Result;
                }));
            }
            else
            {
                InvokeOneWayMethod(requestContext, args, contextChain);
                //完全不用处理,因为客户端没有记录 oneway 的 sequence id,处理反而造成麻烦。
                //try
                //{
                //    WriteResponse(outProtocol,
                //                          sequenceId,
                //                          TMessageType.Reply,
                //                          "success",
                //                          (short)0,
                //                          _successCodec,
                //                          null);

                //}
                //catch (Exception e)
                //{
                //    TaskCompletionSource<Boolean> resultFuture = new TaskCompletionSource<bool>();
                //    resultFuture.TrySetException(e);
                //    return resultFuture.Task;
                //}
                return(Task.FromResult(true));
            }
        }