それを行うための直接または簡単な方法はありません。遅延したジョブはsorted sets
に保持されます score
としての処理時間 value
としてのジョブペイロード 。
ソートされたセットから要素を削除する方法はいくつかあります(それらのほとんどは、遅延キューのサイズに応じていくつかの作業が必要です)
- ディスパッチされたジョブの「正確な」ペイロードを取得し、ZREMを使用してそれを削除します。オブジェクト(すべてのパラメーターを含むジョブのシリアル化されたバージョン)は巨大になる可能性があり、一意の識別子があるため「正確な」ジョブを作成できないため、困難です。あなたはZRANGEBYSCOREと
WITHSCORES
でそれのリストを得ることができます 。それはあなたに彼らのスコアで仕事のリストを与えるでしょう。スコアを使用して、遅延ジョブを識別することができます。値(シリアル化されたペイロード)を取得してから、ZREM
を使用します 。 - 特定の時間に処理されるジョブが1つしかない場合は、処理された時間を使用してZREMRANGEBYSCOREを使用できます。その時点で正確に処理されるジョブがn個ある場合は、
ZREMRANGEBYSCORE
以降、他のジョブも削除できます。 時間間隔がかかります。 - ZSCANを使用して遅延リスト全体を(ページ付けを使用して)スキャンし、ジョブのスコアと識別子を見つけてから、識別子とともにZREMRANGEBYLEXを使用して削除することができます。
- 別の方法として、
handle
の先頭にキャンセル条件を設定することができます。 方法。これには、アプリケーション層の開発が必要です。ジョブをキューにプッシュするときはいつでも、識別子をジョブに送信し、同じ識別子(理解できる)をRedisにも入れます(EXPIRE
を使用) 遅延時間よりも大きい)。キャンセルしたい場合は、Redisから削除してください。 handleメソッド内で、指定された識別子がRedisに存在するかどうかを確認します。存在しない場合は、コードブロックから早期に戻ります。