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 verhindert werden kann, dass die nachfolgende $operations
aufgerufen wird, 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 gehen mymodule_batch_finished
quelle
Antworten:
In Ihrem Batch - Rückruf, in dem Sie die Batch - Arbeit tun, sollten Sie in der Lage zu setzen ,
$context['finished']
um1
, und das wird zu Drupal signalisieren , dass die Charge abgeschlossen sind.Also in Ihrem Fall:
Und noch besser, Sie können auch im eine Fehlermeldung übergeben
$context
, die Sie in Ihrem fertigen Rückruf überprüfen und im Fehlerfall dem Endbenutzer anzeigen können.Wenn Sie die Verarbeitung anderer Rückrufe in der Liste sofort beenden möchten
$operations
, müssen Sie möglicherweise zu Beginn jedes Rückrufs nach einer statischen Variablen suchen und den Rückruf überspringen, wenn ein Fehler vorliegt. Sie können versuchen,variable_get
/variable_set
oder einen anderen Mechanismus zu verwenden, der zwischen Seitenanforderungen bestehen bleibt. Dies wäre jedoch definitiv eine Hackish / Last-Resort-Lösung!Siehe auch:
quelle
Können Sie den folgenden Code ausprobieren?
quelle
mymodule_batch_finished