競拍延時場景:如果在競拍活動距離結束的最后x分鐘內有人出價,活動的結束時間自動往后延長x分鐘;
java中 如何將商品從 競拍中變成 已結束?定時任務?多執行緒?
uj5u.com熱心網友回復:
這個和訂單超時處理是類似場景.1.定時查詢資料庫/redis
2.時間輪
3.delayQueue
4.RabbitMQ延遲佇列
推薦第四種
uj5u.com熱心網友回復:
這個是純演算法問題,與 java 無關。需求比較奇葩,或者描述不清,競拍結束的最后x分鐘有人出價,活動結束時間為什么向后延長?不合常理。
延遲處理:不需要定時器,只要有人競拍,判斷結束標志,如果已結束,競拍無效,否則計算競拍時間與結束時間的時間差x,將結束時間向后延遲x。
結束判斷:這個需要定時器,輪詢判斷結束時間是否已到,如果已到就更新結束標志。
代碼里需要注意多執行緒的變數加鎖問題。
uj5u.com熱心網友回復:
簡單說就是 一次出價后,30分鐘內沒有人出價,就競拍結束,有人出價,在這個時間點上再推遲30分鐘。有點類似于秒殺成功,30分鐘 要付款的機制。
一般有:
1、輪詢(不實時,性能低)、
2、延遲佇列:訊息入佇列,但是30分鐘后才進行消費;
3、定時任務,類似于延遲佇列,30分鐘后回呼自己,比如Quartz。
推薦后面2種方案,
但是資料量大時,延遲佇列,可能導致MQ記憶體積壓,出現一些性能問題,甚至崩潰。
第3個方案,往 Quartz 登記一個定時任務和url,讓它30分鐘后呼叫這個url,這個比較輕量,性能也比較好。
uj5u.com熱心網友回復:
延時用Timer就好了。
Timer timer=new Timer();
var task=new TimerTask() {
@Override
public void run() {
}
};
timer.schedule(task , 10000);計劃任務
task.cancel();//中途取消任務
timer.schedule(task , 10000);//重新計劃任務
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24190.html
標籤:Java相關
