经过几天漫长的问题分析、处理、测试、验证,定时器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不定时的更多相关文章

  1. 定时器Timer不定时

    订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...

  2. Python--day41--threading中的定时器Timer

    定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...

  3. 解决windows 服务中定时器timer 定时偶尔失效 问题

    最近做个windows 服务,功能是:定时执行一个任务:自动登录到一个网站后,点击相关网面上的按钮button. 在处理的过程中发现定时器老是不定时的失效,失效时间没有规律. 由于刚开始处于测试阶段, ...

  4. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  5. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  6. Java进阶(十八)Java实现定时器(Timer)

    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...

  7. Linux应用层的定时器Timer使用详解【转】

    转自:http://blog.csdn.net/wwwtovvv/article/details/8601528 版权声明:本文为博主原创文章,未经博主允许不得转载. linux下定时器的使用 -- ...

  8. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  9. Go定时器--Timer

    目录 前言 Timer 定时器 简介 使用场景 1. 设定超时时间 2. 延迟执行某个方法 Timer对外接口 1. 创建定时器 2. 停止定时器 3. 重置定时器 其他接口 1. After() 2 ...

随机推荐

  1. Oracle Latch的学习【原创】

    Latch详解 - MaxChou 本文以学习为目的,大部分内容来自网络转载. 什么是Latch 串行化 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.多个 ...

  2. 按要求编写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+= ...

  3. python中mysqldb的用法

    1.引入MySQLdb库 import MySQLdb 2.和数据库建立连接 conn=MySQLdb.connect(host="localhost",user="ro ...

  4. Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...

  5. TCP连接建立系列 — 服务端接收ACK段(一)

      http://blog.csdn.net/zhangskd/article/details/17923917 分类: Linux TCP/IP Linux Kernel 2014-01-07 09 ...

  6. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  7. 这几天研究DotNetOpenAuth4.2源码发现的坑

    第一,DLL都是签名的,要放到GAC里,如果想去掉强签 名,在VS属性->签名里 取消勾选,没有用,原来是有一个全局的文件在tools/DotNetOpenAuth.props ,里面SignA ...

  8. poj1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 68414   Accepted: 2648 ...

  9. android listView嵌套gridview的使用心得

    在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...

  10. oracle plsql 捕获异常和抛出异常

    在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题. 捕获异常 语法: 首先定义异常: <异常情况>  E ...