Kann ein Batch-Prozess gestoppt werden?

7

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 $operationsist das Array der aufzurufenden Funktionen?

Jede Funktion verwendet PDO zum Aktualisieren der Datenbank. Ich versuche herauszufinden, wie verhindert werden kann, dass die nachfolgende $operationsaufgerufen 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

Robbert
quelle
Wie führen Sie derzeit das Speichern in der Datenbank durch? Was löst den Batch-Prozess aus?
Randell
Details hinzugefügt, um Ihre Fragen zu beantworten.
Robbert

Antworten:

14

In Ihrem Batch - Rückruf, in dem Sie die Batch - Arbeit tun, sollten Sie in der Lage zu setzen , $context['finished']um 1, und das wird zu Drupal signalisieren , dass die Charge abgeschlossen sind.

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 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_setoder einen anderen Mechanismus zu verwenden, der zwischen Seitenanforderungen bestehen bleibt. Dies wäre jedoch definitiv eine Hackish / Last-Resort-Lösung!

Siehe auch:

geerlingguy
quelle
0

Können Sie den folgenden Code ausprobieren?

$result = array('status' => FALSE, 'data' => $message);
die(json_encode($result));
Anil Sagar
quelle
Das zeigt mir nur eine Fehlerseite. Ich möchte die verbleibenden Operationen umgehen und direkt zumymodule_batch_finished
Robbert