本周来泉州出差,所做的任务是在27上布一个定时器,定时每天早上六点下载微信支付宝的对账单,并将数据以Json的格式传到72上。
创建一个WindowsService,在上面写一个定时器。具体代码如下:
public partial class MyService : ServiceBase { public static string i; public MyService() { InitializeComponent(); } System.Timers.Timer timer1; int iHour = 11; int iMinute =48; int iSecond = 00; protected override void OnStart(string[] args) { timer1 = new System.Timers.Timer(); timer1.Interval = 1000; //设计计时器间隔执行时间 timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed); timer1.Enabled = true; //D:\WebSites\定时器 if (!EventLog.SourceExists("OnStart222")) { EventLog.CreateEventSource("OnStart222", "jason"); } EventLog.WriteEntry("OnStart222", "开始任务了"); } protected override void OnStop() { this.timer1.Enabled = false; EventLog.WriteEntry("OnStop", "任务结束"); } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { int intHour = e.SignalTime.Hour; int intMinute = e.SignalTime.Minute; int intSecond = e.SignalTime.Second; // write(intHour + ":" + intMinute + ":" + intSecond); StatementOfAccount ss = new StatementOfAccount(); if (intHour == iHour && intMinute == iMinute&&intSecond==iSecond) { // write(intHour + ":" + intMinute + ":" + intSecond + " 每天00:00:00!\n\r"); ss.WechatAccount(); i= ss.AlipayAccount(); ss.ReadExcel(i); } }
在设定的时间触发定时器,在应用程序中执行定期事件。在早上11:48:00时执行ss.WechatAccount(); i= ss.AlipayAccount();ss.ReadExcel(i);这三个方法。
从支付宝下载对账单,是通过阿里给的一条URL去请求数据,底层代码阿里已经封装好了,我们只是调用阿里的底层代码就行,返回的地址通过下载文件的方法可以下载对账单的压缩包到自己指定的文件夹里面。因为要返回Json格式的数据给72代码里面,所以要把压缩包里面Excel文件的数据一条一条读取出来,因此要解压文件并读取文件的内容。这时候问题就出来了,偶尔会报错,提示Excel的文件正在被另一个进程占用,正常情况下打断点一步一步查,但是断点一步一步走却发现不了问题,数据也能出来,而程序运行却会报错。因为提示的错误是Excel文件被另一个进程占用,导致在读取Excel文件时候报错,所以我猜测应该是Excel在解压过程中就被读取,所以才会报那个进程被占用的错误。但是有时候运行的时候又不会报错。原因是下载的压缩文件里面有两个Excel文件,如果刚好读取的文件与正在解压的文件是同一个文件时,就会报进程被占用的错误。因此报进程被占用的概率是50%,解决的方法就是将解压文件和读取文件从同一个方法里面分离出来,写成两个方法,这样可以保证在解压完成后才会读取文件的内容。
我之前一直以为,只有执行完上一行的代码后才能执行下一行的代码,但是通过这次报错后发现,并不是上一行代码执行完才执行下一行的代码,也可能是同时执行,其实也可能是执行一行的代码所需要的事件太短到可以忽略的程度,所以才会出现这次遇到的这样的问题,上一行代码文件刚在解压,下一行代码文件就被读取。
取到Json,通过给定的URL地址,就可以把账单数据传到72去插库了。
其实从阿里和微信那边取到的数据插到库里面的时候,相对对账来说只是拿到数据而已,最重要的是将拿到的数据和本地数据库里面的数据进行对比,找到两边数据有异常的,即数据不一致(本地有,微信支付宝账单上没有或者微信支付宝账单有,本地没有)。完成这样的对比有两个方向,要么把本地数据写成Excel文件,和微信支付宝的数据通过Excel文件功能进行两个Excel文件的对比,或者把微信支付宝账单数据放到数据库,通过两个表进行对比。
写文件流(将数据写到一个txt文件里面):
FileStream fileStream = File.Open(@"D:\WebSites\定时器\AliPay.txt", FileMode.Append);//初始化文件流 byte[] array = Encoding.Default.GetBytes(postData);//给字节数组赋值 fileStream.Write(array, 0, array.Length);//将字节数组写入文件流 fileStream.Close();//关闭流 fileStream.Dispose();
注:文件必须是已经存在的,否则会报错!
原文地址:https://www.cnblogs.com/cc1120/p/9120855.html