it-swarm.com.de

Kann ein Batch-Prozess gestoppt werden?

Gibt es eine Möglichkeit, einen Batch-Prozess zum Stoppen zu zwingen, wenn ein Fehler auftritt? Insbesondere habe ich einen Stapel, der mit dem Speichern eines Datensatzes in einer Datenbank beginnt. Jede nachfolgende Stapeloperation hängt davon ab, ob die Datenbankeinfügung ordnungsgemäß funktioniert. Ich möchte den Stapel zum Stoppen zwingen, wenn der erste Stapel fehlschlägt.

Die Charge heißt so

$batch = array(
    'operations' => $operations,
    'finished' => 'mymodule_batch_finished',
    'title' => t('Merging records'),
    'init_message' => t('Starting processing'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Processing has encountered an error'),
    'file' => drupal_get_path('module', 'mymodule') . '/forms/mymodule.inc'
);

wo $operations ist das Array der aufzurufenden Funktionen.

Jede Funktion verwendet PDO zum Aktualisieren der Datenbank. Ich versuche herauszufinden, wie ich das nachfolgende $operations wird nicht aufgerufen, wenn die Abfrage in der aktuellen Operation fehlschlägt.

try {
  $sth = $dbh->prepare($sql);
  $sth->bindParam(':newid',$new_id,PDO::PARAM_INT);
  $sth->bindParam(':id',$id,PDO::PARAM_INT);
  if($sth->execute()) {
    $context['results']['[] = $sth->rowCount();
  }
  else {
    // TODO: stop processing due to an error
  }
}
catch(PDOException $e) {
  // TODO: stop processing due to an error
}

Wenn ein Fehler auftritt, möchte ich die verbleibenden Vorgänge umgehen und direkt zu mymodule_batch_finished

7
Robbert

In Ihrem Batch-Rückruf, in dem Sie die Batch-Arbeit ausführen, sollten Sie in der Lage sein, $context['finished'] bis 1, und das signalisiert Drupal, dass der Stapel abgeschlossen ist.

Also in Ihrem Fall:

$error = FALSE;
try {
  $sth = $dbh->prepare($sql);
  $sth->bindParam(':newid',$new_id,PDO::PARAM_INT);
  $sth->bindParam(':id',$id,PDO::PARAM_INT);
  if($sth->execute()) {
    $context['results'][] = $sth->rowCount();
  }
  else {
    $error = TRUE;
  }
}
catch (PDOException $e) {
  $error = TRUE;
}
// If there was an error, immediately complete the batch process.
if ($error) {
  $context['finished'] = 1;
}

Und noch besser, Sie können eine Fehlermeldung im $context, auf die Sie in Ihrem abgeschlossenen Rückruf prüfen können, und die Sie dem Endbenutzer im Fehlerfall anzeigen.

Wenn Sie sofort beenden möchten, beenden Sie die Verarbeitung anderer Rückrufe in $operations Liste, müssen Sie möglicherweise auch zu Beginn jedes Rückrufs nach einer statischen Variablen suchen und den Rückruf überspringen, wenn er in einem Fehlerzustand ist. Sie könnten versuchen, variable_get/variable_set oder ein anderer Mechanismus, der zwischen Seitenanforderungen bestehen bleibt. Dies wäre jedoch definitiv eine Hackish/Last-Resort-Lösung!

Siehe auch:

14
geerlingguy

Können Sie den folgenden Code ausprobieren?

$result = array('status' => FALSE, 'data' => $message);
die(json_encode($result));
0
Anil Sagar