订餐系统之定时器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 ...
随机推荐
- SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过
SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过 存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...
- django自动化部署脚本
while read line;do echo'kill '$line; kill $line; done < /tmp/celeryd.pid while read line;do echo' ...
- linux centos使用xrdp远程界面登陆
redhat6 安装xrdp 直接使用windows远程桌面连接登陆 下面介绍实现方法: 第一步:下载源码包,并安装一些依赖的软件下载xrdp源码包 wget http://downloads.so ...
- EarthWarrior3D游戏ios源码
这是一款不错的ios源码源码,EarthWarrior3D游戏源码, 并且游戏源代码支持多平台. 适用于cocos v2.1.0.0版本 源码下载:http://code.662p.com/view/ ...
- openwrt修改flash大小
前言 默认openwrt trunk编译出来的flash大小为8M,但是我们手上的板子可能flash大小更大,本文以MT7620a为例,将其flash大小由8M修改为16M或者32M 增加dts文件 ...
- 手动添加jar包到maven
废话不说,先上图,后说明: 1.登录系统 2.跟着箭头和方框走,一直到 Select Artifact(s) to Upload... 按钮 3.点击Select Artifact(s) to Upl ...
- 最新discuz模版制作7堂课让你精通discuz模版制作
第一课 基本知识储备一.基本 HTML 代码二.网站语言编码 三.DIV+CSS 认知及应用 第二课 必备软件.环境配置及程序安装 第三课 DISCUZ 构架详解 一.DISCUZ 基础构架讲 ...
- go 字符变量
go语言变量定义 第一类,通过关键字var来声明,可以在main函数体外 // varStudy //变量在main函数体外声明 package main import ( "fmt&quo ...
- Codeforces 410C.Team[构造]
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- div根据内容改变大小并且左右居中
div{ display:inline-block; width:auto; } 这个div的父元素text-align:center;