using DistTransDto; using DistTransServices; using PWMIS.EnterpriseFramework.Service.Basic; using PWMIS.EnterpriseFramework.Service.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DistTransClient { class Program { static void Main(string[] args) { DistTrans3PCState state ;//= DistTrans3PCState.Rep_Yes_1PC; if (typeof(DistTrans3PCState).IsEnum) { state = (DistTrans3PCState)Enum.Parse(typeof(DistTrans3PCState), "Rep_Yes_1PC"); } Proxy client = new Proxy(); client.ErrorMessage += client_ErrorMessage; Console.Write("请输入服务器的主机名或者IP地址(默认 127.0.0.1):"); string host = Console.ReadLine(); if (string.IsNullOrEmpty(host)) host = "127.0.0.1"; Console.WriteLine("服务地址:{0}", host); Console.Write("请输入服务的端口号(默认 8888),如果是订单服务,请输入 12308:"); string port = Console.ReadLine(); if (string.IsNullOrEmpty(port)) port = "8888"; Console.WriteLine("服务端口号:{0}", port); client.ServiceBaseUri = string.Format("net.tcp://{0}:{1}", host, port); Console.WriteLine("当前客户端代理的服务基础地址是:{0}", client.ServiceBaseUri); Console.WriteLine(); Console.WriteLine("MSF 分布式事务 模式调用示例:"); //TestSample(client); TestCreateOrder(client); Console.ReadLine(); } private static void TestCreateOrder(Proxy client) { List buyProducts = new List(); buyProducts.Add(new BuyProductDto() { ProductId=1, BuyNumber=3}); buyProducts.Add(new BuyProductDto() { ProductId =2, BuyNumber = 1 }); int orderId = 8000; int userId = 100; ServiceRequest request = new ServiceRequest(); request.ServiceName = "OrderService"; request.MethodName = "CreateOrder"; request.Parameters = new object[] { orderId,userId, buyProducts }; bool result=client.RequestServiceAsync(request).Result; if(result) Console.WriteLine("创建订单成功,订单号:{0}",orderId); else Console.WriteLine("创建订单失败,订单号:{0}", orderId); Console.WriteLine("------开始并发下单测试,按任意键继续---------"); Console.ReadLine(); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); int taskCount = 10; List tasks = new List(); for (int i = 1; i <= taskCount; i++) { Proxy client1 = new Proxy(); client1.ServiceBaseUri = client.ServiceBaseUri; ServiceRequest request1 = new ServiceRequest(); request1.ServiceName = "OrderService"; request1.MethodName = "CreateOrder"; request1.Parameters = new object[] { orderId+i, userId, buyProducts }; var task = client1.RequestServiceAsync(request1); tasks.Add(task); Console.WriteLine("添加第 {0}个任务.",i); } Console.WriteLine("{0} 个订单请求任务创建完成,开始等待所有任务执行完成!",taskCount); Task.WaitAll(tasks.ToArray()); Console.WriteLine("所有任务执行完成!"); sw.Stop(); Console.WriteLine("总耗时:{0}(s),TPS:{1}",sw.Elapsed.TotalSeconds,(double)taskCount /sw.Elapsed.TotalSeconds); } private static void TestSample(Proxy client) { /* ServiceRequest request = new ServiceRequest(); request.ServiceName = "DTCService"; request.MethodName = "RegisterTransaction"; request.Parameters = new object[] { "1234567890" }; client.Subscribe(request, s => { Console.WriteLine("ServerMessage:{0}", s); client.SendTextMessage("client ...."); }, para => { Console.WriteLine("服务器回调消息:{0}",para); Console.Write("事务是否执行成功?(yes/no)"); string repMsg1 = Console.ReadLine(); if (repMsg1 == "yes") return DistTrans3PCState.Rep_Yes_1PC; else return DistTrans3PCState.Rep_No_1PC; } ); */ ServiceRequest request = new ServiceRequest(); request.ServiceName = "DemoService"; request.MethodName = "TransactionTest"; request.Parameters = new object[] { 3, 2 }; /* Task task = client.RequestServiceAsync(request, s => { Console.WriteLine("接收到服务器指令:{0}", s); Console.WriteLine("即将回复服务器,请输入回复内容(yes/no/错误信息),也可以直接关闭本进程。"); string rep = Console.ReadLine(); if (s == "CanCommit") { Console.WriteLine("回复结果:是否可以提交:{0}", rep); } else if (s == "DoCommit") { Console.WriteLine("回复结果:提交是否成功:{0}", rep); } Console.WriteLine(); return rep; } ); try { task.Wait(); Console.WriteLine("服务访问完成,结果:{0}", task.Result); } catch (Exception ex) { Console.WriteLine("访问服务错误:{0}",ex.Message); } */ client.RequestService(request.ServiceUrl, PWMIS.EnterpriseFramework.Common.DataType.Text, r => { Console.WriteLine("服务访问完成,结果:{0}", r); }, s => { Console.WriteLine("接收到服务器指令:{0}", s); Console.WriteLine("即将回复服务器,请输入回复内容(yes/no/错误信息),也可以直接关闭本进程。"); string rep = Console.ReadLine(); if (s == "CanCommit") { Console.WriteLine("回复结果:是否可以提交:{0}", rep); } else if (s == "DoCommit") { Console.WriteLine("回复结果:提交是否成功:{0}", rep); } Console.WriteLine(); return rep; }); System.Threading.Thread.Sleep(1000 * 60 * 60); string repMsg = "ok"; while (repMsg != "") { Console.Write("回复服务器(输入为空,则退出):>>"); repMsg = Console.ReadLine(); client.SendTextMessage(repMsg); } } static void client_ErrorMessage(object sender, MessageSubscriber.MessageEventArgs e) { //如果是分布式事务,这里应该回滚 Console.WriteLine("请求服务器错误:{0}", e.MessageText); } } }