예제 #1
0
        public void TestRpcServer()
        {
            var methodNames = new string[] {
                "method1"
                , "method2"
            };
            IRpcServer receiver = new RpcServer(_conn, methodNames, "rpc-test", parallelDegree: 10);

            receiver.RegisterMessageHandlerByAssembly(typeof(MessageHandler01).Assembly, "ERP.External.Commands");
            receiver.OnMessageHandlingFailed += (sender, args) =>
            {
                //TODO:持久化消息处理失败的信息,以备后续之后重试
            };
            var receiveMessageDict = new ConcurrentDictionary <string, Tuple <bool, IMessageTransportationContext> >();

            receiver.OnMessageReceived += (sender, e) =>
            {
                receiveMessageDict.TryAdd(e.Context.GetMessageId(), new Tuple <bool, IMessageTransportationContext>(false, e.Context));
            };
            receiver.OnMessageHandlingSucceeded += (sender, e) =>
            {
                receiveMessageDict.AddOrUpdate(e.Context.GetMessageId(), new Tuple <bool, IMessageTransportationContext>(true, e.Context), (key, originVal) => new Tuple <bool, IMessageTransportationContext>(true, originVal.Item2));
            };

            //Task.Run(() =>
            //{
            //    var timeout = 100;
            //    var executeSeconds = 0;
            //    while (receiveMessageDict.Count == 0 || receiveMessageDict.Values.Any(w => !w.Item1 && w.Item2.LastException == null))
            //    {
            //        if (executeSeconds > timeout)
            //        {
            //            break;
            //        }
            //        Thread.Sleep(1000);
            //        executeSeconds++;
            //    }
            //    var failList = receiveMessageDict.Values.Where(w => !w.Item1).ToList();
            //});
            receiver.ReceiveRequest();
        }