利用多线程解决多业务不同定时区间歇触发问题的一种方法

 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

项目中需要解决一个这样的问题:有两个业务均需要每隔几秒触发一次,但是两个业务都只是在规定的时间区域内才进行该行为。比如,在早上八点到晚上六点为上班时间,在这个时间段内两个业务必须每隔几秒被执行一次,下班后则停止工作。

2.思路

这个问题最开始我是想利用timer来解决,即做两个timer,一个timer来控制一个事务,然后在各事务对应时间区域内执行。

但是考虑到Timer是在主线程里执行的,Thread 是在自己的线程中执行的,在多核多线程的 CPU 中,利用Thread的效率高更高一些。而且后期事务变多,控制更复杂,用timer也不是很利于扩展。所以最后决定使用多线程来解决该问题。

经过思考以及参阅类似案例,比如http://www.cnblogs.com/shuang121/archive/2012/07/05/2578033.html,最后将框架设计成如下结构:

                       

3.具体实现

3.1 IshedulerJob

 

3.2 Job

 

3.3SchedulerConfiguration

 

3.4Scheduler

 

3.5 viewer

 

4. 优化

a.两个事务均涉及到数据库的多数据增删查改,为了保证数据的唯一性,对数据库操作均采取事务型操作。

 

b.为了避免数据库的重复连接和关闭,这里尽量使用数据库的长连接。同时,为了避免两个事务共用一个数据库连接而出现的问题,特地使用简单的数据库连接池进行处理。

 

c.为了连接池能被共享,对连接池所在类进行单例模式。

 

 

                                                                                     -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                                   如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                        

时间: 2024-10-01 12:57:30

利用多线程解决多业务不同定时区间歇触发问题的一种方法的相关文章

解决Win7下安装VS2010不显示序列号框的两种方法

VS2010在Windows 7下安装,一些朋友发现怎么在安装的时候输入序列号框怎么不出现呢?这该如何解决?下面西部e网的icech就找到了两种解决方法帮您解决这个问题: 1.修改setup.sdb文件的方法 这是一个老办法了,setup.sdb文件是从ISO文件中提取出来的setup文件进行编辑,只需要修改里面的[Product Key]项,在安装的时候就不用输入序列号了. 这里icech提供的是: [Product Key] YCFHQ9DWCYDKV88T2TMHG7BHP 也可以根据你的

Visual C++利用多线程模拟并行计算

随着信息时代的到来,需要处理的信息量越来越庞大,需要解决的问题越来越复杂,使得计算量剧增.通过提高单个处理器的计算速度和采用传统的"顺序(串行)"计算技术已难以胜任.因此,需要有功能更强大的计算机系统和计算机技术来支撑.并行计算机及并行计算技术应运而生. 但由于缺乏实验环境和机器设备,我们普通人很难研究并行算法,即使有了想法也同样面临着无法验证的尴尬.不过,好在像面向对象语言c++,java等都提供了多线程,使我们可以模拟多台处理机.下面,我就一个简单的例子,向大家介绍一下在vc下如何

怎么利用多线程LRU刷新突破MySQL瓶颈?

In this blog post, we'll discuss how to use multi-threaded LRU flushing to prevent bottlenecks in MySQL. 在这篇文章中,我们会讨论怎么利用多线程LRU刷新突破MySQL的瓶颈. In the previous post, we saw that InnoDB 5.7 performs a lot of single-page LRU flushes, which in turn are ser

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

利用uniread 解决 Linux下的SQL*Plus 命令行历史回调功能

解决|命令行 利用uniread 解决 Linux下的SQL*Plus 命令行历史回调功能 作者: Fenng 大家知道, 在 Windows 平台 命令行中的 SQL*Plus 有命令行历史回调的功能,在SQL*Plus工具下面,可以利用键盘的"向上向下"箭头键对命令行的进行回调.而在Linux上则没有该功能(虽然 Shell 可以做到这一点,但是 SQL*Plus 不可以). 而该功能对于CLI爱好者来说几乎是不可缺的,不知道为什么 Oracle 不把这个功能加进来.不得而知了.

利用jquery解决MVC下…问题

利用jquery解决MVC下A potentially dangerous Request.QueryString value was detected from the client问题 其实A potentially dangerous Request.QueryString value was detected from the client错误原 因是mvc检测了您的请求,如果有'<'等字符串,就会有这个错误.解决办法在action前 加 [AcceptVerbs(HttpVerbs.P

利用JS解决ie6不支持max-width,max-height问题

 本篇文章主要介绍了利用JS解决ie6不支持max-width,max-height问题的方法.需要的朋友可以过来参考下,希望对大家有所帮助 今天遇到一个关于用js解决ie6不支持支持max-width,max-height的问题,刚开始用jQuery方法来实现,不过一直获取不到css里面的值,如   代码如下:   if($.browser.msie && $.browser.version == 6.0)   {     var maxWidth = parseInt($('.view

如何解决分布式系统中的跨时区问题[实例篇]

关于如何解决分布式系统中的跨时区问题,上一篇详细介绍了解决方案的实现原理,在这一篇中我们通过一个完整的例子来对这个问题进行深入探讨.尽管<原理篇>中介绍了那么多,解决方案的本质就是:在进行服务调用过程中将客户端的时区信息作为上下文传入服务端,并以此作为时间转换的依据.我们首先定一个具体的类型来定义包含时区信息的上下文类型,我们将这个类型起名为ApplicationContext. 一.通过CallContext实现ApplicationContext 在<通过WCF扩展实现Context

动态规划 扑克-利用动态规划解决n张扑克连接问题

问题描述 利用动态规划解决n张扑克连接问题 有n卡扑克,分别有A B C D四种花色,扑克面值为 0~9,花色相同或者面值相同的两张扑克可以进行连接,其中,面值为8的扑克可以与任意的扑克进行连接.问怎么样从这n张牌中找出最长的连接组合.n张牌是随机给出的.