亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

取消 Laravel 中的作業

取消 Laravel 中的作業

PHP
蕪湖不蕪 2023-08-06 14:53:44
如果我調用以下內容:return AdventureJob::dispatch($event->character->refresh(), $event->adventure, $event->levelsAtATime)->delay($timeTillFinished);這將創建一個延遲 x 分鐘的作業。我的作業都是通過redis處理的,有沒有辦法獲取這個特定的作業或從隊列中刪除這個特定的作業?人們談論 php artisan 命令然后刪除所有作業,這不是我想要的我想要獲取有關此作業的某種信息(作業 ID?或隊列 ID?Redis ID?)然后存儲在數據庫中,以便如果然后玩家取消冒險,我可以使用它在隊列中找到該作業并將其刪除,假設它沒有運行。
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

沒有直接或簡單的方法可以做到這一點。延遲的作業保留在sorted sets待處理時間score和作業負載中value。

有多種方法可以從排序集中刪除元素(大多數方法需要一些努力,具體取決于延遲隊列的大?。?,例如

  • 您獲得分派作業的“準確”有效負載,然后使用ZREM將其刪除。這很困難,因為對象(具有所有參數的作業的序列化版本)可能很大,并且您無法創建“精確”作業,因為它具有唯一標識符。您可以使用ZRANGEBYSCORE和獲取它的列表WITHSCORES。它將為您提供職位列表及其分數。您可以使用分數來識別要延遲的工作。獲取值(序列化有效負載)然后使用ZREM.

  • 如果在特定時間只有一項作業要處理,您可以使用ZREMRANGEBYSCORE并使用處理時間。如果正好有 n 個作業需要在該時間處理,那么其他作業也可以被刪除,因為ZREMRANGEBYSCORE需要時間間隔。

  • 您可以嘗試使用ZSCAN掃描整個延遲列表(帶分頁)并找到作業的分數和標識符,然后使用ZREMRANGEBYLEX和標識符將其刪除。

  • 另一種方法可以是在方法的開頭放置取消條件handle。這個需要應用層開發。每當您將作業推送到隊列時,您都會向該作業發送一個標識符,并將相同的標識符(您可以理解的)也放入Redis中(大于EXPIRE延遲時間)。當你想取消它時,然后從Redis中刪除它。在handle方法內部檢查Redis中是否存在給定的標識符,如果不存在則從代碼塊提前返回。


查看完整回答
反對 回復 2023-08-06
  • 1 回答
  • 0 關注
  • 138 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號