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

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

 

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

目标: client 使用消息队列 将订单信息保存, 服务端使用  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

六 . client 代码

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

  /// <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)));}

client配置文件 截图

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

小小心得 不正确的地方 请多多不吝赐教 .

转载于:https://www.cnblogs.com/yxysuanfa/p/6731532.html

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

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

    需求: 针对 淘宝提出的 订单全链路 产品接入 .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. C语言编写Windows服务程序

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

  5. 书剑恩仇录online全套源代码(服务端+client+文档)

    书剑恩仇录online全套源代码(服务端+client+文档).vc++开发,解压后将近10G大小,眼下网上最完整版本号,包括client源代码.服务端源代码.工具源代码.sdk.文档-- <书 ...

  6. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  7. php推送手机,PHP_解析php做推送服务端实现ios消息推送,准备工作1.获取手机注册应用 - phpStudy...

    解析php做推送服务端实现ios消息推送 准备工作1.获取手机注册应用的deviceToken(iphone手机注册应用时返回唯一值deviceToken) 2.获取ck.pem文件(做手机端的给) ...

  8. mPaaS 服务端核心组件:消息推送 MPS 架构及流程设计

    0. 前言 根据<开篇 | mPaaS 服务端核心组件体系概述>的介绍,我们已经知道 mPaaS 的 MPS 服务主要提供了专业的移动消息推送方案,可以针对不同的场景提供多种推送类型,满足 ...

  9. nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...

    C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...

最新文章

  1. 工作量证明的最长链原则到底说的是什么?
  2. JS中怎样获取当前年以及前后几年并构造成对象数组
  3. error: expected ‘{‘ before ‘;‘ token
  4. jsp放在web-inf下的注意事项
  5. [ NOIP 2014 ] TG
  6. linux关于bashrc与profile的区别(转)
  7. 现在流行「毕业式」裁员吗?
  8. js进阶 10-1 JQuery是什么
  9. 泛微OA如何重置管理员密码
  10. 关于人工智能数据标注学习
  11. 前端页面开发浅谈:PC 端设计如何“完美”迁移到移动端?
  12. 网络工程师必备技术汇总
  13. 10.Audio音频
  14. 第八篇order订单专题(2)订单通知及属性
  15. 【echarts地图制作】下钻到乡镇/街道级别的
  16. Bounding box regression RCNN我的理解
  17. IOT网关开发受难记-(一) 2022/05/13
  18. 第917期机器学习日报(2017-03-23)
  19. 小程序在同一个页面中,当改选radio选项的时候,显示出不同的内容,不触碰事件时都隐藏?
  20. android获取定位并标点,Android Studio 中实现高德定位并获取相应信息

热门文章

  1. 18650电池模块3.7V7.4V锂电池模块 11.1V锂电池模块充电宝UPS电源
  2. 神仙联动!港科大和中山大学宣讲会专场!
  3. 深入理解硬盘的 Linux 分区
  4. 全国产业带“回血”之战,为什么天猫双11是最佳主场?
  5. html块级元素转换内联,HTML中的块级元素和内联元素
  6. itextpdf创建pdf,开箱即用
  7. 商务智能-考试复习提纲
  8. python归一化 增大差异_练习赛1:Titanic
  9. 球队管理菜单用英文怎么说
  10. JavaScript编写输入框计算器