锁定老帖子 主题:倒计时的实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-04-19
订单记录好提交时间。系统配置文件设置定时多长时间。用户查到订单返回提交时间。这时根据当前时间,提交时间,以及配置的定时时间,计算出一个倒计时的时间。然后做个JS的倒计时就OK了吧。不需要考虑什么其他的吧... 关于第2点实现很多,可以在数据库直接定时JOB扫描就可以了吧。另外系统也可以做定时任务,只是这个耗用太高不划算,再或者过时之后不去做任何处理,当用户再次处理时提示过时?
|
|
返回顶楼 | |
发表时间:2013-04-19
wujiazhao88 写道 第一个问题, 你不用每次时间变化都去ajax请求服务端, 隔个几秒或者几十秒ajax一下, 然后把客户端的时间校正为服务端的时间即可, 当然由于网络引起的一点偏差还是要注意的.
第二个问题, 由于你有超时的限制, 你不需要立刻把订单的状态更改, 只需要用户在前台查看的时候给他一个超时的提醒就好了, 当然实际他发起付款的时候, 你也可以判断一下是不是超时了, 超了就拒绝付款. 至于订单状态的更改不需要实时, 隔一断时间把超时的订单的状态一起改一下就行了.. 当然, 如果你还要有超时候给用户发消息的功能的话, 就必须得实时一点, 用一个线程或者线程池就足够了, 不需要每次都新建一个线程, 不然你的内存容易被线程挤爆.. 我也没准备随时校准时间。。JS我就准备在插件初始化时赋值。然后就由JS控件来自动倒计时了。。。 但是第二个必须要实时。定时任务定时扫描的话。我就是担心随着数据量的扩大。。速度越来越慢。。。因为这个要求实时性很高。。1分钟以内还可以接受。。。超过1分钟。。。就可能会有投诉的。。 |
|
返回顶楼 | |
发表时间:2013-04-19
yuur369 写道 wujiazhao88 写道 第一个问题, 你不用每次时间变化都去ajax请求服务端, 隔个几秒或者几十秒ajax一下, 然后把客户端的时间校正为服务端的时间即可, 当然由于网络引起的一点偏差还是要注意的.
第二个问题, 由于你有超时的限制, 你不需要立刻把订单的状态更改, 只需要用户在前台查看的时候给他一个超时的提醒就好了, 当然实际他发起付款的时候, 你也可以判断一下是不是超时了, 超了就拒绝付款. 至于订单状态的更改不需要实时, 隔一断时间把超时的订单的状态一起改一下就行了.. 当然, 如果你还要有超时候给用户发消息的功能的话, 就必须得实时一点, 用一个线程或者线程池就足够了, 不需要每次都新建一个线程, 不然你的内存容易被线程挤爆.. 我也没准备随时校准时间。。JS我就准备在插件初始化时赋值。然后就由JS控件来自动倒计时了。。。 但是第二个必须要实时。定时任务定时扫描的话。我就是担心随着数据量的扩大。。速度越来越慢。。。因为这个要求实时性很高。。1分钟以内还可以接受。。。超过1分钟。。。就可能会有投诉的。。 java 并发包中有个 DelayQueue, 应该适合你的场景. 用户下单的时候放一个任务到delayQueue里面, 到点出列再处理是否需要改状态. 注意如果你怕重启数据丢失, 那么可以放到数据库中.重启的时候把延时的数据reload到delayQueue里面. |
|
返回顶楼 | |
发表时间:2013-04-20
wujiazhao88 写道 java 并发包中有个 DelayQueue, 应该适合你的场景. 用户下单的时候放一个任务到delayQueue里面, 到点出列再处理是否需要改状态. 注意如果你怕重启数据丢失, 那么可以放到数据库中.重启的时候把延时的数据reload到delayQueue里面. 我研究下。 |
|
返回顶楼 | |
发表时间:2013-04-21
wujiazhao88 写道 yuur369 写道 wujiazhao88 写道 第一个问题, 你不用每次时间变化都去ajax请求服务端, 隔个几秒或者几十秒ajax一下, 然后把客户端的时间校正为服务端的时间即可, 当然由于网络引起的一点偏差还是要注意的.
第二个问题, 由于你有超时的限制, 你不需要立刻把订单的状态更改, 只需要用户在前台查看的时候给他一个超时的提醒就好了, 当然实际他发起付款的时候, 你也可以判断一下是不是超时了, 超了就拒绝付款. 至于订单状态的更改不需要实时, 隔一断时间把超时的订单的状态一起改一下就行了.. 当然, 如果你还要有超时候给用户发消息的功能的话, 就必须得实时一点, 用一个线程或者线程池就足够了, 不需要每次都新建一个线程, 不然你的内存容易被线程挤爆.. 我也没准备随时校准时间。。JS我就准备在插件初始化时赋值。然后就由JS控件来自动倒计时了。。。 但是第二个必须要实时。定时任务定时扫描的话。我就是担心随着数据量的扩大。。速度越来越慢。。。因为这个要求实时性很高。。1分钟以内还可以接受。。。超过1分钟。。。就可能会有投诉的。。 java 并发包中有个 DelayQueue, 应该适合你的场景. 用户下单的时候放一个任务到delayQueue里面, 到点出列再处理是否需要改状态. 注意如果你怕重启数据丢失, 那么可以放到数据库中.重启的时候把延时的数据reload到delayQueue里面. 第一个问题,赞同就是直接js做个倒计时就好了(唯一要做的就是客户端时间和真实时间差别太大的时候的处理)。 第二个问题,一般也就增加一个字段:“过期时间(=下单时间+超时时间)”,也不需要任何定时器,或线程了。显示的时候只要判断下当前时间和这个值就ok了,这不很简单吗??? |
|
返回顶楼 | |
发表时间:2013-04-22
skzr.org 写道 wujiazhao88 写道 yuur369 写道 wujiazhao88 写道 第一个问题, 你不用每次时间变化都去ajax请求服务端, 隔个几秒或者几十秒ajax一下, 然后把客户端的时间校正为服务端的时间即可, 当然由于网络引起的一点偏差还是要注意的.
第二个问题, 由于你有超时的限制, 你不需要立刻把订单的状态更改, 只需要用户在前台查看的时候给他一个超时的提醒就好了, 当然实际他发起付款的时候, 你也可以判断一下是不是超时了, 超了就拒绝付款. 至于订单状态的更改不需要实时, 隔一断时间把超时的订单的状态一起改一下就行了.. 当然, 如果你还要有超时候给用户发消息的功能的话, 就必须得实时一点, 用一个线程或者线程池就足够了, 不需要每次都新建一个线程, 不然你的内存容易被线程挤爆.. 我也没准备随时校准时间。。JS我就准备在插件初始化时赋值。然后就由JS控件来自动倒计时了。。。 但是第二个必须要实时。定时任务定时扫描的话。我就是担心随着数据量的扩大。。速度越来越慢。。。因为这个要求实时性很高。。1分钟以内还可以接受。。。超过1分钟。。。就可能会有投诉的。。 java 并发包中有个 DelayQueue, 应该适合你的场景. 用户下单的时候放一个任务到delayQueue里面, 到点出列再处理是否需要改状态. 注意如果你怕重启数据丢失, 那么可以放到数据库中.重启的时候把延时的数据reload到delayQueue里面. 第一个问题,赞同就是直接js做个倒计时就好了(唯一要做的就是客户端时间和真实时间差别太大的时候的处理)。 第二个问题,一般也就增加一个字段:“过期时间(=下单时间+超时时间)”,也不需要任何定时器,或线程了。显示的时候只要判断下当前时间和这个值就ok了,这不很简单吗??? 非常赞同第二个问题的解答。至于第一个问题,如果时间要求准确的话,可以参考NTP协议实现,只需要两段AJAX请求就可以很好的同步时间。如果需要特别准确的同步时间的话,可以使用如下JS类库来实现NTP协议,进行同步时间。类库地址如下:http://jehiah.cz/a/ntp-for-javascript 注:该类库使用prototype中的ajax调用部分,不喜的话可以很简单的替换为其它JS库的ajax调用,如jQuery。 |
|
返回顶楼 | |
发表时间:2013-04-22
skzr.org 写道 第一个问题,赞同就是直接js做个倒计时就好了(唯一要做的就是客户端时间和真实时间差别太大的时候的处理)。 第二个问题,一般也就增加一个字段:“过期时间(=下单时间+超时时间)”,也不需要任何定时器,或线程了。显示的时候只要判断下当前时间和这个值就ok了,这不很简单吗??? 不仅仅是显示的问题,在超时的时候系统还要做些操作的。。我已经决定用delayqueue了。。这个的确很方便,比线程扫描靠谱多了。 |
|
返回顶楼 | |
发表时间:2013-04-22
yuur369 写道 skzr.org 写道 第一个问题,赞同就是直接js做个倒计时就好了(唯一要做的就是客户端时间和真实时间差别太大的时候的处理)。 第二个问题,一般也就增加一个字段:“过期时间(=下单时间+超时时间)”,也不需要任何定时器,或线程了。显示的时候只要判断下当前时间和这个值就ok了,这不很简单吗??? 不仅仅是显示的问题,在超时的时候系统还要做些操作的。。我已经决定用delayqueue了。。这个的确很方便,比线程扫描靠谱多了。 你可以做个持久化版本的delayQueue, 期待开源 |
|
返回顶楼 | |
发表时间:2013-04-23
最后修改:2013-04-23
yuur369 写道 skzr.org 写道 第一个问题,赞同就是直接js做个倒计时就好了(唯一要做的就是客户端时间和真实时间差别太大的时候的处理)。 第二个问题,一般也就增加一个字段:“过期时间(=下单时间+超时时间)”,也不需要任何定时器,或线程了。显示的时候只要判断下当前时间和这个值就ok了,这不很简单吗??? 不仅仅是显示的问题,在超时的时候系统还要做些操作的。。我已经决定用delayqueue了。。这个的确很方便,比线程扫描靠谱多了。 如果你的实时要求n秒,那么,直接后台一个timer,周期n秒,查询一次: 交易标志=false and end_time > System.currentTimes(),然后对这些订单处理。一个线程,一个查询搞定,由数据库保证事务多好。 |
|
返回顶楼 | |