No hay una manera directa o fácil de hacerlo. Los trabajos retrasados se mantienen en sorted sets
como tiempo a ser procesado como score
y la carga útil del trabajo como el value
.
Hay varias formas de eliminar un elemento de los conjuntos ordenados (la mayoría de ellos requieren algunos esfuerzos dependiendo del tamaño de la cola retrasada) como
- Obtienes la carga útil "exacta" del trabajo enviado y luego usas ZREM para eliminarlo. Es difícil porque el objeto (versión serializada del trabajo con todos los parámetros) puede ser enorme y no puede crear el trabajo "exacto" porque tiene un identificador único. Puede obtener la lista con ZRANGEBYSCORE y con
WITHSCORES
. Te dará la lista de trabajos con sus puntajes. Puede usar la puntuación para identificar un trabajo retrasado. Obtenga el valor (carga útil serializada) y luego useZREM
. - Si solo hay un trabajo para procesar en un momento específico, puede usar ZREMRANGEBYSCORE con el tiempo de procesamiento. Si hay n trabajos para procesar exactamente en ese momento, también se pueden eliminar otros trabajos desde
ZREMRANGEBYSCORE
toma un intervalo de tiempo. - Puede intentar usar ZSCAN para escanear toda la lista retrasada (con paginación) y encontrar la puntuación y el identificador del trabajo, y luego usar ZREMRANGEBYLEX con el identificador para eliminarlo.
- Otra forma podría ser poner una condición de cancelación al comienzo de
handle
método. Este requiere el desarrollo de la capa de aplicación. Cada vez que envía un trabajo a la cola, envía un identificador al trabajo, coloque el mismo identificador (que pueda entender) en Redis también (conEXPIRE
mayor que el tiempo de retardo). Cuando desee cancelarlo, elimínelo de Redis. Dentro del método handle, verifique si el identificador dado existe en Redis, si no regresa antes del bloque de código.