JAVA 竞拍延时如何更改商品状态

qq_14999623 2020-08-10 03:50:23
竞拍延时场景:如果在竞拍活动距离结束的最后x分钟内有人出价,活动的结束时间自动往后延长x分钟;
java中 如何将商品从 竞拍中变成 已结束?定时任务?多线程?
...全文
2347 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
游北亮 2020-08-11
  • 打赏
  • 举报
回复
简单说就是 一次出价后,30分钟内没有人出价,就竞拍结束,有人出价,在这个时间点上再推迟30分钟。 有点类似于秒杀成功,30分钟 要付款的机制。 一般有: 1、轮询(不实时,性能低)、 2、延迟队列:消息入队列,但是30分钟后才进行消费; 3、定时任务,类似于延迟队列,30分钟后回调自己,比如Quartz。 推荐后面2种方案, 但是数据量大时,延迟队列,可能导致MQ内存积压,出现一些性能问题,甚至崩溃。 第3个方案,往 Quartz 登记一个定时任务和url,让它30分钟后调用这个url,这个比较轻量,性能也比较好。
datafansbj 2020-08-11
  • 打赏
  • 举报
回复
这个是纯算法问题,与 java 无关。

需求比较奇葩,或者描述不清,竞拍结束的最后x分钟有人出价,活动结束时间为什么向后延长?不合常理。

延迟处理:不需要定时器,只要有人竞拍,判断结束标志,如果已结束,竞拍无效,否则计算竞拍时间与结束时间的时间差x,将结束时间向后延迟x。

结束判断:这个需要定时器,轮询判断结束时间是否已到,如果已到就更新结束标志。

代码里需要注意多线程的变量加锁问题。
大隐藏于寺 2020-08-11
  • 打赏
  • 举报
回复
这个和订单超时处理是类似场景. 1.定时查询数据库/redis 2.时间轮 3.delayQueue 4.RabbitMQ延迟队列 推荐第四种
八爻老骥 2020-08-11
  • 打赏
  • 举报
回复
延时用Timer就好了。


Timer timer=new Timer();

var task=new TimerTask() {

@Override
public void run() {


}
};

timer.schedule(task , 10000);计划任务

task.cancel();//中途取消任务

timer.schedule(task , 10000);//重新计划任务
JJC001 2023-07-10
  • 举报
回复
@八爻老骥 请问多节点部署,timer可用吗

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧