Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Bull-Warteschlange:Wenn ein Job fehlschlägt, wie kann die Warteschlange daran gehindert werden, verbleibende Jobs zu verarbeiten?

In bull Es ist nicht möglich, denselben Job unmittelbar nach seinem Fehler zu wiederholen, bevor der nächste Job in der Warteschlange aufgenommen wird.

Lösung:

  1. Erstellen Sie einen neuen Job und setzen Sie seine Priorität auf einen niedrigeren Wert als den aktuellen Jobtyp.
  2. Geben Sie den fehlgeschlagenen Job frei (resolve() oder done() )
  3. Dieser neue Job wird sofort vom bull abgeholt zur Verarbeitung.

Beispielcode:Im folgenden Code Job-3 wird scheitern und einen neuen Job schaffen und so weiter, bis "der Zweck des Jobs" irgendwann erfolgreich ist.

var Queue = require('bull');

let redisOptions = {
  redis: { port: 6379, host: '127.0.0.1' }
}
var myQueue = new Queue('Linear-Queue', redisOptions);

myQueue.process('Type-1', function (job, done) {
  console.log(`Processing Job-${job.id} Attempt: ${job.attemptsMade}`);
  downloadFile(job, async function (error) {
    if (error) {
      await repeatSameJob(job, done);
    } else {
      done();
    }
  });
});

async function repeatSameJob(job, done) {
  let newJob = await myQueue.add('Type-1', job.data, { ...{ priority: 1 }, ...job.opts });
  console.log(`Job-${job.id} failed. Creating new Job-${newJob.id} with highest priority for same data.`);
  done(true);
}

function downloadFile(job, done) {
  setTimeout(async () => {
    done(job.data.error)
  }, job.data.time);
}

myQueue.on('completed', function (job, result) {
  console.log("Completed: Job-" + job.id);
});

myQueue.on('failed', async function (job, error) {
  console.log("Failed: Job-" + job.id);
});

let options = {
  removeOnComplete: true, // removes job from queue on success
  removeOnFail: true // removes job from queue on failure
}

for (let i = 1; i <= 5; i++) {
  let error = false;
  if (i == 3) { error = true; }

  setTimeout(i => {
    let jobData = {
      time: i * 2000,
      error: error,
      description: `Job-${i}`
    }
    myQueue.add('Type-1', jobData, options);
  }, i * 2000, i);
}

Ausgabe: