需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group

oms(订单管理系统) 实现  , 完成后 效果:在千牛工作台 --订单全链路  可看到效果如下图

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目标: 客户端 使用消息队列 将订单信息保存, 服务端使用  Windows服务 ,将消息队列中的订单信息 通过淘宝api 上传到淘宝.

---(截图上传了 4次 才看到效果 ,最后从简  见谅)

一、创建一个Windows Service

1)创建Windows Service项目

2)对Service重命名

将Service1重命名为你服务名称,这里我们命名为TradeTraceService。

二、创建服务安装程序

1)添加安装程序

之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。

2)修改安装服务名

右键serviceInsraller1,选择属性,将ServiceName的值改为TradeTraceService。

  • 补充:

1.Service启动属性:

Manual      服务安装后,必须手动启动。

Automatic    每次计算机重新启动时,服务都会自动启动。

Disabled     服务无法启动。

3)修改安装权限

右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。

三、创建 类库 封装方法(用于:将消息队列中数据 通过淘宝api上传到淘宝 ),写入服务代码

1) 创建类库

2) 创建接口 和对应实现

3) 代码展示

ITradeTraceService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;namespace TradeTrace.Service
{[ServiceContract]public interface ITradeTraceService{/// <summary>/// 把订单信息插入到队列里/// </summary>/// <param name="orderSource"></param>/// <param name="orderNum"></param>/// <param name="status"></param>/// <param name="createtime"></param>[OperationContract(IsOneWay = true)]void Insert(int orderSource, string orderNum, int status, DateTime createtime );}
}

TradeTraceService.cs

using ECERP.FrameWork.Log;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;namespace TradeTrace.Service
{[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]public class TradeTraceService : ITradeTraceService{public void Insert(int orderSource, string orderNum, int status, DateTime createtime){Logger.Info(string.Format("[淘宝订单 全链路]读取店铺:{0},订单:{1},状态:{2}", orderSource, orderNum, status));DateTime dt = DateTime.Now;if (string.IsNullOrEmpty(orderNum) || orderNum == "0" ||orderSource==0){Logger.Info(string.Format("[淘宝订单 全链路]发布消息 时读取到 异常单号:{0},店铺:{1},时间:{2}", orderNum, orderSource, dt));return;}try{var list = ECERP.AddIn.ShopService.ShopList;var shop = list.FirstOrDefault(c => c.ID == orderSource);//var shop = ECERP.Service.ShopService.Instance.GetShopByID(orderSource);if (shop != null){ECERP.AddIn.TaoBao.Service.TradeTraceService trace = new ECERP.AddIn.TaoBao.Service.TradeTraceService(shop);trace.TradeTraceMessageProduce(orderNum, status, createtime);Logger.Info("OrderNum:" + orderNum + "  createtime:" + createtime + " OrderSource:" + orderSource + "耗时:" + (DateTime.Now - dt));}else{Logger.Info("shop is null" + orderSource);}}catch (Exception ex){Logger.Error("淘宝订单 全链路 (正向交易状态跟踪消息) 异常", ex);}}}
}

4) 写入服务代码:打开TradeTraceService代码

右键TradeTraceService.cs,选择查看代码。

TradeTraceService.cs

using ECERP.FrameWork.Log;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Messaging;
using System.ServiceModel;
using System.ServiceProcess;
using System.Text;namespace TradeTrace.Host
{public partial class TradeTraceService : ServiceBase{ServiceHost host = new ServiceHost(typeof(TradeTrace.Service.TradeTraceService));public TradeTraceService(){InitializeComponent();}protected override void OnStart(string[] args){if (!MessageQueue.Exists(@".\private$\tradetracelist")){Logger.Info("不存在队列创建");var mq = MessageQueue.Create(@".\private$\tradetracelist", true);//可以根据实际情况自己设置mq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);}else{Logger.Info("已经存在队列");}try{host.Open();Logger.Info("服务开始启动了");}catch (Exception ex){Logger.Error("err", ex);}}protected override void OnStop(){try{host.Close();Logger.Info("服务关闭了");}catch (Exception ex){host.Abort();Logger.Error("err",ex);}}}
}

应用程序入口  Program.cs

using ECERP.FrameWork.Log;
using System;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Text;namespace TradeTrace.Host
{static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>static void Main(string[] args){string f = AppDomain.CurrentDomain.BaseDirectory + "Log.config";log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(f));Logger.Info("start...");try{// 运行服务if (args.Length == 0){try{ServiceBase[] ServicesToRun = new ServiceBase[] { new TradeTraceService() };ServiceBase.Run(ServicesToRun);}catch (Exception ex){Logger.Error("err", ex);}}// 安装服务else if (args[0].ToLower() == "/i" || args[0].ToLower() == "-i"){try{string[] cmdline = { };string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly().Location;TransactedInstaller transactedInstaller = new TransactedInstaller();AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);transactedInstaller.Installers.Add(assemblyInstaller);transactedInstaller.Install(new System.Collections.Hashtable());}catch (Exception ex){Logger.Error("err", ex);//string msg = ex.Message;}}// 删除服务else if (args[0].ToLower() == "/u" || args[0].ToLower() == "-u"){try{string[] cmdline = { };string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly().Location;TransactedInstaller transactedInstaller = new TransactedInstaller();AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);transactedInstaller.Installers.Add(assemblyInstaller);transactedInstaller.Uninstall(null);}catch (Exception ex){Logger.Error("err", ex);}}}catch (Exception ex){ Logger.Error("err", ex);}}}
}

5) log.config 日志文件 和app.config 数据库配置 文件

log.config  基本 没啥大变化  不做展示

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration><connectionStrings><add name="local" connectionString="server=.;database=txttt0808;uid=sa;Pwd=" providerName="sql2005"/></connectionStrings><system.serviceModel><services><service name="TradeTrace.Service.TradeTraceService"><endpoint address="net.msmq://localhost/private/tradetracelist" binding="netMsmqBinding"bindingConfiguration="msmq" contract="TradeTrace.Service.ITradeTraceService" /></service></services><bindings><netMsmqBinding><binding name="msmq" exactlyOnce="true"><security mode="None" /></binding></netMsmqBinding></bindings></system.serviceModel><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

需注意的 是 消息队列 服务地址配置

6) 项目整体 展示

四、安装 服务

用.net framework工具INSTALLUTIL安装服务程序即可。

用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:

installutil yourproject.exe

五、卸载 服务

用项目的输出作为参数,从命令行运行 InstallUtil.exe。

installutil /u yourproject.exe

六 . 客户端 代码

公共方法 : 在你任务 需要的 地方 自己调用

  /// <summary>/// 把订单信息保存到msmq里/// </summary>/// <param name="list"></param>private void SaveTradeTraceToMsmq(List<SalesOrder> list){ChannelFactory<TradeTrace.Service.ITradeTraceService> channelFactory = new ChannelFactory<TradeTrace.Service.ITradeTraceService>("TradeTraceServiceClient");TradeTrace.Service.ITradeTraceService calculate = channelFactory.CreateChannel();int i = 0;DateTime beginTime = DateTime.Now;foreach (var order in list){calculate.Insert(order.OrderSource.GetValueOrDefault(0), order.OrderNum, order.Status.GetValueOrDefault(0),DateTime.Now);Logger.Info(string.Format("orderNum:{0} createtime:{1} shop:{2} no:{3}", order.OrderNum, order.ModifyTime, shop.Name, ++i));}Logger.Info(string.Format("{0}保存进队列{1}/{2}条 time:{3} 耗时:{4}", shop.Name, i, list.Count, DateTime.Now, DateTime.Now.Subtract(beginTime)));}

客户端配置文件 截图

总结:  Windows服务 和消息队列的 结合使用 会让你的 程序 焕然一新,更加灵活 . 消息队列的 相关知识 请自寻资料了解.

小小心得 不对的地方 请多多指教 .

C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果相关推荐

  1. C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果

    需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...

  2. php监听mq消息,客户端监听服务端获取rabbitmq消息队列,rabbitmq有消息的时候客户端刷新页面才能获取到消息,监听没起到作用,请求各位大神指点迷津...

    header("Content-Type:text/html;charset=utf-8"); use Workerman\Worker; require_once __DIR__ ...

  3. 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

    HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...

  4. 一个简单的完成端口(服务端/客户端)类

    一个简单的完成端口(服务端/客户端)类 作者:spinoza 翻译:麦子芽儿, POWERCPP(后面部分内容) 下载源代码 原文网址:http://www.codeproject.com/KB/IP ...

  5. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答...

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  6. linux 进程sockfd fork,Linux下多进程服务端客户端模型一(单进程与多进程模型)...

    本文将会简单介绍Linux下如何利用C库函数与系统调用编写一个完整的.初级可用的C-S模型. 一.基本模型: 1.1   首先服务器调用socket()函数建立一个套接字,然后bind()端口,开始l ...

  7. C语言编写Windows服务程序

    C语言编写Windows服务程序 原文:C语言编写Windows服务程序 #include <Windows.h> #include <stdio.h>#define SLEE ...

  8. restful服务端客户端_测试RESTful服务的客户端

    restful服务端客户端 开发使用RESTful Web API的应用程序可能意味着开发服务器和客户端. 为服务器端编写集成测试可以像使用Arquillian启动服务器一样容易,并且可以通过REST ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

最新文章

  1. cogs 2320. [HZOI 2015]聪聪的世界题解
  2. ElementUI项目请求SpringBoot后台项目时提示:Access to XMLHttpRequest at **from origin ** has been blocked by CORS
  3. Qt平台和编译器说明-Android
  4. activex for chrome扩展程序 下载”_chrome系列-扩展程序开发学习-从无到有
  5. curl命令java_Java中的curl命令
  6. 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法
  7. 终于等到放学了的飞鸽传书
  8. 如何在CentOS 7上使用HAproxy Loadbalancer设置Percona XtraDB集群(负载均衡)
  9. Eclipse里面的快捷键
  10. 明星分手文案火了!为了营销 你们这些商家也是很努力啊...
  11. Python初识以及变量
  12. smote算法 不平衡数据集处理方法
  13. Lightning 转 USB Type-A/Type-C 思路
  14. 8086 CPU 寄存器
  15. JavaScript --------WebS APIs学习之网页特效(offset系列)
  16. 华硕服务器怎么装win7系统教程,华硕win7系统重装教程
  17. /tmp/ccAceHhY.o: In function `main': main.c:(.text+0xc7): undefined reference to `dlopen' main.c:
  18. 5、分组密码工作模式
  19. EOS CPU资源不足?ET钱包帮你解决
  20. 天翼云赋能工业行业 安全上云更有保障

热门文章

  1. 阶段总结(一)——我的大学
  2. random.randint()与numpy.random.randint()的区别
  3. 差分法 (分数比较)
  4. 天猫粉丝嘉年华:一次品牌粉丝营销的“大满贯”
  5. live off用法
  6. 郑州银行app未能连接到服务器,关于f5:F5-Prober-Pool技术为郑州银行实现了模拟业务拨测...
  7. 用开源OA项目做一个OA办公系统,能拥有哪些功能?
  8. 第三部分第52节:女性特质(1)
  9. 从零快速搭建仿抖音短视频APP-后端开发粉丝业务模块(4)
  10. C#: double转int , String转int