WEB系统数据库字段在一段时间后自动修改的问题(SSH)

2019-03-25 13:38|来源: 网路

现在有一个类似工作流的系统,但是没有使用jbpm框架,SSH2开发环境。

问题是这样的:

有一个请求request(id,status),某角色的用户将次数据库中存放的某一id的request的status修改为某一个值时,比如open,则从修改时开始计时,若没有其他用户将它的状态改为其他值,那么24小时后,要让此request的status字段自动变为另一个值,并不让任何用户再修改。
请问如何实现?


我的一个思路是在status被修改成open时,启动一个线程开始计时,若有人修改了它,则取消计时,若没有人修改,那么24小时后修改它。
有没有哪位高人有更好的实现方法。先谢过了!


问题补充:
xutao5641745 写道
我推荐用  Spring定时任务。。。。


我看了一下spring的定时任务,那这个触发器怎么写呢?
因为考虑如果状态被更改的话,这个任务就要取消了。请指教。

问题补充:
xutao5641745 写道
那建议你用 任务调度框架Quartz,可定制性强多了



任务调度框架Quartz文档
http://blog.csdn.net/alex197963/archive/2009/08/06/4417995.aspx


先谢谢了,这个项目不能使用其他框架了,若像楼上所说,用spring的任务调度怎么解决呢?

问题补充:
jansonzhan 写道
1、可以通过程序中的任务调度(如Quartz),进行定时去扫描符合条件的进行修改

2、可以使用数据库的任务调度(如oracle的job),进行定时去扫描符合条件的进行修改



确定的是24小时的时间间隔,而且状态能被主动改变,能详细说明实现方式吗?

另外,使用的数据库是mysql5.0,这个版本的mysql似乎没有任务调度。

问题补充:
jiangnan2112 写道
个人觉得你还线程好些,如果时间要求很准的话要任务调度要执行的频率太高,不高的话时间不好把握,不划算!

首先谢谢你的回答,但是我还是有疑问:

1、当记录产生比较多的时候,线程就会很多,这不是很浪费资源和影响性能吗?

2、而且考虑下面一种情况:

假如记录r的status被A从start修改为open,此时一个线程t1启动,并准备在24小时后将其status修改为close;可是假如在此期间,A又将其状态改为start,并在线程t1的24小时计时内又将状态改为open,此时又一线程t2启动,并开始计时24小时并修改为close,可是此时线程t1并不知情,他还是会去修改,可是此时t1的计时已经无意义了,t2的计时才有意义,这种情况如何处理呢??

问题补充:
7454103 写道
具体的业务逻辑还是你自己比较清楚!
  一般的做法可能大概分两种方式吧:
1.0 Spring定时任务(Quartz,timer) ,或者 thread 一类定时去扫描那个字段的值!最好有一个【最后的修改时间字段】!然后做不同的修改!
至于具体的怎么去修改,触发 应该不难吧! 或者直接用thread 也比较好控制!具体的代码只能结合你自己的代码写咯!
2.0 触发式刷新!就是每次读那个字段的时候 判断下 【前提是有个最后的刷新时间】
  然后做一些处理!

大同小异吧! 个人感觉上面那些提议都是可以的!只要你理解了就好办!


谢谢回答。

经过您和各位的提示,您看我这样设计合不合适:

在系统启动时,查询记录中所有状态为close的记录,并用一个Map保存每个记录的ID和open的时间,并在系统启动时用一个线程定时(如5分钟)扫描这个Map,如果记录的时间和系统时间差大于24小时,就修改状态为close。在系统运行中,每次修改记录状态时,如果改成start就同时将其ID从Map中移除(如果有的话),如果改成close,就将其加到Map中。

您觉得这样做可不可行,有什么缺点吗?

相关问答

更多