订餐系统之定时器Timer不定时
经过几天漫长的问题分析、处理、测试、验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案,也请不吝赐教。
先交代下背景吧:“订单审核后,商家3分钟内未确认的订单,自动生成催单记录,客服通过催单记录联系商家,于是,我们就用的System.Threading.Timer 来作来定时器”。下图为Timer初始化部分代码:

因为是重要客户,我们本地测试服务器都经过自认为严格的测试后,才提交正式服务器。可是,每次提交正式服务器后,每天总有几个时间段不定时生成催单记录,然后我们自己测试又都正常,于是不了了之!反复几次,客户不高兴了,领导怒了,做为程序员的我,才开始冷静了,到底哪里出了问题?
1.消失的33分钟
当然,首先,还是检查网站中程序记录的日志,因为我们定时程序是每分钟执行一次(因为是多个任务,每个任务执行的时间间隔是不一样的,所以每分钟判断哪个任务可以执行),所以日志是比较容易查询的,于是,看到了下图:

网站在这个时间点上,没任何错误信息,服务器在这个点上也没任何人为操作。当确认程序上基本没有问题,我开始查询系统日志了。
2.应用程序池工作进程被回收
知道这个时间点出问题了,在系统日志中我很快找到了此时间的日志,于是看到了下图:

原来是没有访问,被回收了,直到有人访问时,再创建进程,到这里才明白,为什么我们测试都正常,因为我们测试时,一直在访问,所以一切正常。
3.让网站自己访问自己
当知道问题后,就开始纠结处理方案了,有人说写服务器程序,创建一个服务,让此服务去生成催单,但因为是正式服务器,我们没办法链接的,所以此方案虽好,但对我们来说不切实际;google了下,找到一个自认为简单、可行的方案,如下图(不记得来源了,见谅):

发布后,测试了几个小时,呀,还真正常了,于是通知客户测试。结果,还是如前几次一样,他们一用就出问题了。只能继续查看系统日志...
4.进程在关闭过程中超出时间限制
虽然结果还是一样,但是我们离真相越来越近了,找到出错时间点前后的网站日志和系统日志,看到了下图的信息:
网站日志:

系统日志:

5.程序池配置
看到上图的问题,我最先想到的还是对程序池进行配置,之前对这方便了解也不多,也google了一个比较文明的配置,然后根据情况调整了几个参数:


修改配置后,问题依然存在,路在何方?
6.失败不可怕,再来一次!
回收时,访问失败,如果过15s再访问呢,是的,失败不可怕,再来一次,于是,有了下面的代码:

发布、测试,1小时正常,3小时正常,8小时正常,24小时正常,30小时正常,心总算能踏实了,但是回头想了下,进程都回收了,为什么再访问一次程序会执行,IIS日志中每次回收时,都只有一条访问记录,只有得空时再好好研究下了!
写了几年代码,还是第一次,通过这么多日志,特别是服务器的日志来解决问题,过程虽然漫长,但还是苦并快乐着!!!
30小时正常,也许到80小时,160小时,又会有问题了,持续关注中...
成为一名优秀的程序员!
订餐系统之定时器Timer不定时的更多相关文章
- 定时器Timer不定时
订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...
- Python--day41--threading中的定时器Timer
定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...
- 解决windows 服务中定时器timer 定时偶尔失效 问题
最近做个windows 服务,功能是:定时执行一个任务:自动登录到一个网站后,点击相关网面上的按钮button. 在处理的过程中发现定时器老是不定时的失效,失效时间没有规律. 由于刚开始处于测试阶段, ...
- python中实现定时器Timer
实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...
- PHP框架Swoole的一个定时器Timer特性
在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...
- Java进阶(十八)Java实现定时器(Timer)
Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...
- Linux应用层的定时器Timer使用详解【转】
转自:http://blog.csdn.net/wwwtovvv/article/details/8601528 版权声明:本文为博主原创文章,未经博主允许不得转载. linux下定时器的使用 -- ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
- Go定时器--Timer
目录 前言 Timer 定时器 简介 使用场景 1. 设定超时时间 2. 延迟执行某个方法 Timer对外接口 1. 创建定时器 2. 停止定时器 3. 重置定时器 其他接口 1. After() 2 ...
随机推荐
- Oracle Latch的学习【原创】
Latch详解 - MaxChou 本文以学习为目的,大部分内容来自网络转载. 什么是Latch 串行化 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.多个 ...
- 按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
int[]x=new int [50]; char[][]y=new char[10][10]; int j=1,w=0; for(int i=0;i<50;i++) { x[i]=j; j+= ...
- python中mysqldb的用法
1.引入MySQLdb库 import MySQLdb 2.和数据库建立连接 conn=MySQLdb.connect(host="localhost",user="ro ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- TCP连接建立系列 — 服务端接收ACK段(一)
http://blog.csdn.net/zhangskd/article/details/17923917 分类: Linux TCP/IP Linux Kernel 2014-01-07 09 ...
- java 生产者消费者问题 并发问题的解决
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- 这几天研究DotNetOpenAuth4.2源码发现的坑
第一,DLL都是签名的,要放到GAC里,如果想去掉强签 名,在VS属性->签名里 取消勾选,没有用,原来是有一个全局的文件在tools/DotNetOpenAuth.props ,里面SignA ...
- poj1273 Drainage Ditches
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 68414 Accepted: 2648 ...
- android listView嵌套gridview的使用心得
在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...
- oracle plsql 捕获异常和抛出异常
在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题. 捕获异常 语法: 首先定义异常: <异常情况> E ...