iT邦幫忙

0

java 取得 Thread.sleep()之後狀態

  • 分享至 

  • xImage

手上有一個這樣的需求
在新增案件的時候會需要等待5分鐘 確認該案件為最新版本之後才做發布

原本的想法是
進入controller後先取得案件DB資料
Thread.sleep()結束之後再取一次
比對前後兩個物件是不是一樣

不過這裡不太順利 sleep結束後取的跟sleep之前的物件完全一樣
想問是有那裡有問題 謝謝

我覺得這個需求太詭異,您應該需要把細節說清楚一點比較好懂,光是讓使用者待在那邊五分鐘誰他媽鳥你XDD 太怪了 作法肯定不止一種~~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
pickuse
iT邦新手 4 級 ‧ 2023-06-28 17:21:08

為什麼要用 sleep?如果你用 sleep 的話會凍結執行緒吧?

為什麼不要直接使用 SQL Query 之類的方式「篩選建立時間大於 5 分鐘的案件」?

因為你目前給我的想法是「你想要東西發布以後不要馬上出現,緩衝一下再出現」

如果你能提供更細節的資訊,我會比較好回答。

看更多先前的回應...收起先前的回應...
davil004 iT邦新手 5 級 ‧ 2023-06-28 17:47:32 檢舉

他的要求是案件建立後5分鐘內有被編輯的話就不要發布
所以我就直接在建立完成之後sleep 後再來看是不是案件有被編輯過 沒有的話就繼續走發布的部分

pickuse iT邦新手 4 級 ‧ 2023-06-28 17:50:50 檢舉

可是如果你用Sleep的話會hang住執行緒在那邊,正確方式是你應該要使用SQL之類的方式,建立後狀態設定為「等候中」,然後當畫面被reload你就去檢查建立時間有沒有大於5分鐘的資料,有的話你就把他mark成「發布」,然後如果5分鐘的過程中發生編輯你就直接mark成「已編輯」接著前面的程式碼判斷要跳過他,不就好了?

pickuse iT邦新手 4 級 ‧ 2023-06-28 17:51:43 檢舉

你寫程式的話假設我們今天要等5分鐘,那你不應該真的在那邊等待5分鐘然後其他事情都不處理,這樣不對,你應該要有非同步程式設計的概念

davil004 iT邦新手 5 級 ‧ 2023-06-28 17:53:19 檢舉

舊案維護 DB部分可能不太能動

pickuse iT邦新手 4 級 ‧ 2023-06-28 17:55:43 檢舉

DB資料表多一個狀態欄位也不行?
那你自己維護一個文字檔模擬當資料庫如何?
或是你可以另外架設redis之類的服務(當作額外的資料庫),然後把你這邊剛剛所說的紀錄暫存在上面

pickuse iT邦新手 4 級 ‧ 2023-06-28 17:58:23 檢舉

不過我建議你認真考慮資料庫上面直接多一個欄位會好處理很多

davil004 iT邦新手 5 級 ‧ 2023-06-28 18:00:57 檢舉

順待一題 前面表達方式可能不太精準 我這邊的發布不是指要顯示在網頁上 而是他需要另外把案件資料傳出去這樣

pickuse iT邦新手 4 級 ‧ 2023-06-28 18:02:57 檢舉

那也不影響判斷,基本上你就是有一個東西在後面trigger他就好了,不過我真的不建議使用sleep

pickuse iT邦新手 4 級 ‧ 2023-06-28 18:03:44 檢舉

然後這邊提供你GPT的建議:

  1. 使用消息隊列服務:像是RabbitMQ或Kafka這類的消息隊列系統,可以將消息(在這裡是新增的資料)放入隊列中,設置一個延遲時間(例如5分鐘),在延遲時間過後再將消息發布出去。如果在這段時間內資料被編輯,可以將原來的消息從隊列中移除,並將編輯後的資料作為新的消息加入到隊列中。

  2. 使用時間戳記和版本控制:對於每一筆資料,記錄其創建時間和最後編輯時間,以及一個版本號。當資料被新增時,創建時間和最後編輯時間都設為當前時間,版本號設為1。當資料被編輯時,更新最後編輯時間,並將版本號加1。然後在發布資料的邏輯中,只發布創建時間超過5分鐘且版本號為1的資料。

  3. 使用事件驅動架構:當新增或編輯資料時,發出一個事件。然後有一個獨立的服務來監聽這些事件,並根據事件的類型和時間來決定是否應該發布資料。
    以上的方法都需要一些程式修改,但它們不需要直接修改資料庫的結構,可能會比較適合您的情境。

froce iT邦大師 1 級 ‧ 2023-06-30 10:58:30 檢舉

簡單一點的設計是多開個thread,在新開的thread裡sleep 5分鐘,然後去檢查再發布。
當然樓上提到的MQ才是正解。
你直接在主線程sleep你是要搞死自己吧...

我要發表回答

立即登入回答