Não existe uma maneira direta ou fácil de fazer isso. Os trabalhos atrasados são mantidos em
sorted sets
como tempo a ser processado como score
e carga útil do trabalho como o value
. Existem várias maneiras de remover um elemento dos conjuntos ordenados (a maioria deles requer alguns esforços dependendo do tamanho da fila atrasada), como
- Você obtém a carga útil "exata" do trabalho despachado e usa o ZREM para removê-lo. É difícil porque o objeto (versão serializada do trabalho com todos os parâmetros) pode ser enorme e você não pode criar o trabalho "exato" porque possui um identificador exclusivo. Você pode obter a lista com ZRANGEBYSCORE e com
WITHSCORES
. Ele lhe dará a lista de trabalhos com suas pontuações. Você pode usar a pontuação para identificar o trabalho atrasado. Obtenha o valor (carga útil serializada) e useZREM
. - Se houver apenas um trabalho a ser processado em um horário específico, você poderá usar ZREMRANGEBYSCORE com o uso do tempo processado. Se houver n trabalhos a serem processados exatamente nesse momento, outros trabalhos também poderão ser excluídos desde
ZREMRANGEBYSCORE
leva intervalo de tempo. - Você pode tentar usar o ZSCAN para escanear toda a lista atrasada (com paginação) e encontrar a pontuação e o identificador do trabalho e, em seguida, usar o ZREMRANGEBYLEX com o identificador para removê-lo.
- Outra maneira poderia ser colocar uma condição de cancelamento no início de
handle
método. Este requer o desenvolvimento da camada de aplicação. Sempre que você envia um trabalho para a fila, você envia um identificador para o trabalho, coloque o mesmo identificador (que você possa entender) no Redis também (comEXPIRE
maior do que o tempo de atraso). Quando você quiser cancelá-lo, exclua-o do Redis. Dentro do método handle, verifique se o identificador fornecido existe no Redis, se não retornar antecipadamente do bloco de código.