关于java触发器的经验分享

来源:互联网 发布:矩阵论 科学出版社 编辑:程序博客网 时间:2024/06/01 08:05

触发器是我们在日常中经常使用,但近来却发现了这样一个问题:触发定制时间小于程序执行时间的问题,网络上有很多相关答案,可是我执行以后结果却大相径庭,于是做一番跟踪探索,今天和大家分享一下!

工具/原料

  • Eclipse
  • win7
  • quartz框架

方法/步骤

  1. 1

    今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说是正在执行的程序被强制停止,然后触发器正常启动触发执行,可是都没有说到一种情况,而这种情况我恰好遇到了,大家也许没加到过,但是很普通,就是触发器正常执行,程序也正常执行,它的执行情况是这样的:首先触发器执行,然后开始正常程序操作,可是操作到一半的时候触发器的时间到了,这时候触发器启动了,再次来了一个线程,但是这个线程属于等待当中,然后继续上一次没有执行完的线程,直到上一次线程执行完毕以后开始执行本次正在等待的线程,然后刚开始一点点的时候触发器时间又到了,然后有开启了一个新的线程,此线程又在等待当中,然后执行上一次线程,上一次还没有执行完(快完的时候)触发器时间又到了,又来了一个线程,现在有两个线程在等待,然后继续前一个线程,前一个线程执行完毕以后,执行最先排队等待的线程。如此类推。最后我执行了进一个小时后等待线程达到了20-30个(没有具体统计,但大体看了一下,差不多了),可奇怪的是,这些直到最后也没有报错,也没有说什么内存不足啊什么的,这些线程都等哪去了?后来我执行了更长时间也没有问题,就是累计了大量的线程等待中,这个问题真是郁闷啊,郁闷点有如下几点,经过多方查阅和我相关实现经验,作如下回答,可能有不足之处可提出反馈和补充!

    关于java触发器的经验分享
  2. 2

    如上图是不是感觉混乱,混乱就对了,因为这是执行了很多次以后的,现在有很多线程在等待着执行,同时启动线程又来执行前面的程序,所以乱了,看第二个就是触发器时间足够等待程序执行的情况!(太长没有截图完,阶梯状的),好了让我们来看看问题和解答:

    1、每一次触发器执行的时候都是从头来的,它是怎么记住本次没有执行完毕的线程的而且还准确的记住位置,按道理来说既然触发器启动了,就程序从头开始了,那么前一次线程应该被迫终止啊;

    答:在这里就需要提到系统线程和进程的问题了!对于记住线程位置,那自然是系统的问题,系统默认情况下,一个进程你没有让他截止的时候他是不会截止的,而quartz启动下一个触发器的时候并不会自动让正在执行的进程结束,必须手动执行了,所以在触发器启动下一个线程的时候当前线程并没有终止,而是继续执行,并不会终止,新启动的线程!不好意思,你先等待一下!

  3. 3

    2、这个没有执行完的线程有是被谁记住的?触发器还是java程序的本身的线程池?(我用的定时调度器是quartz2.2.1);

    答:这个问题上面已经回答了,是系统记住的,和这两个都没有关系!因为一个线程启动以后进程就已经交给系统了!

  4. 4

    3、难道触发器还有记录进程的作用吗?

    答:不好意思,触发器暂时还没有这本事其他的暂时我也不清楚,目前我只知道quartz他能启动触发器,定时器和调度器,好像没有记录功能!

  5. 5

    结题:本次案例是为了写博客单独设计的案例,在我实际看法过程中是在连接数据库时发生了时间超过触发器时间而发现web出现已经结束了还在加载浏览器的问题,当时不知道什么原因,回来写了个案例做测试是发现原因,此处涉及商业秘密,就不阐述项目中的问题了!如果出现可有两解决办法:1、调整触发器时间让其足够执行程序;2、手动结束前一进程,否则会出现客户正在看着页面,突然什么都没做又来刷新了一遍,这可是不好的啊!

0 0