為什麼要用 sleep?如果你用 sleep 的話會凍結執行緒吧?
為什麼不要直接使用 SQL Query 之類的方式「篩選建立時間大於 5 分鐘的案件」?
因為你目前給我的想法是「你想要東西發布以後不要馬上出現,緩衝一下再出現」
如果你能提供更細節的資訊,我會比較好回答。
他的要求是案件建立後5分鐘內有被編輯的話就不要發布
所以我就直接在建立完成之後sleep 後再來看是不是案件有被編輯過 沒有的話就繼續走發布的部分
可是如果你用Sleep的話會hang住執行緒在那邊,正確方式是你應該要使用SQL之類的方式,建立後狀態設定為「等候中」,然後當畫面被reload你就去檢查建立時間有沒有大於5分鐘的資料,有的話你就把他mark成「發布」,然後如果5分鐘的過程中發生編輯你就直接mark成「已編輯」接著前面的程式碼判斷要跳過他,不就好了?
你寫程式的話假設我們今天要等5分鐘,那你不應該真的在那邊等待5分鐘然後其他事情都不處理,這樣不對,你應該要有非同步程式設計的概念
舊案維護 DB部分可能不太能動
DB資料表多一個狀態欄位也不行?
那你自己維護一個文字檔模擬當資料庫如何?
或是你可以另外架設redis之類的服務(當作額外的資料庫),然後把你這邊剛剛所說的紀錄暫存在上面
不過我建議你認真考慮資料庫上面直接多一個欄位會好處理很多
順待一題 前面表達方式可能不太精準 我這邊的發布不是指要顯示在網頁上 而是他需要另外把案件資料傳出去這樣
那也不影響判斷,基本上你就是有一個東西在後面trigger他就好了,不過我真的不建議使用sleep
然後這邊提供你GPT的建議:
使用消息隊列服務:像是RabbitMQ或Kafka這類的消息隊列系統,可以將消息(在這裡是新增的資料)放入隊列中,設置一個延遲時間(例如5分鐘),在延遲時間過後再將消息發布出去。如果在這段時間內資料被編輯,可以將原來的消息從隊列中移除,並將編輯後的資料作為新的消息加入到隊列中。
使用時間戳記和版本控制:對於每一筆資料,記錄其創建時間和最後編輯時間,以及一個版本號。當資料被新增時,創建時間和最後編輯時間都設為當前時間,版本號設為1。當資料被編輯時,更新最後編輯時間,並將版本號加1。然後在發布資料的邏輯中,只發布創建時間超過5分鐘且版本號為1的資料。
使用事件驅動架構:當新增或編輯資料時,發出一個事件。然後有一個獨立的服務來監聽這些事件,並根據事件的類型和時間來決定是否應該發布資料。
以上的方法都需要一些程式修改,但它們不需要直接修改資料庫的結構,可能會比較適合您的情境。
簡單一點的設計是多開個thread,在新開的thread裡sleep 5分鐘,然後去檢查再發布。
當然樓上提到的MQ才是正解。
你直接在主線程sleep你是要搞死自己吧...