バッチ処理を停止できますか


7

なんらかのエラーが発生した場合にバッチプロセスを強制的に停止する方法はありますか?特に、レコードをデータベースに保存することから始まるバッチがあります。後続の各バッチ操作は、データベースの挿入が正しく機能していることに依存しています。最初のバッチが失敗した場合、バッチを強制的に停止したいと思います。

バッチはこのように呼ばれます

$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'
);

どこ$operationsに呼び出す関数の配列です。

各関数はPDOを使用してデータベースを更新します。$operations現在の操作でクエリが失敗した場合に後続のメソッドが呼び出されないようにする方法を理解しようとしています。

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
}

エラーが発生した場合は、残りの操作をバイパスして直接 mymodule_batch_finished


現在、データベースへの保存をどのように実行していますか?バッチプロセスをトリガーするものは何ですか?
ランデル、2014年

質問に答えるために詳細を追加しました。
ロバート

回答:


14

あなたは、バッチ作業を行うバッチコールバック、内部では、設定することができるはず$context['finished']1、それはバッチが完了したことのDrupalに通知します。

したがって、あなたの場合:

$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;
}

さらに、エラーメッセージをで渡す$contextこともできます。完了したコールバックで確認し、エラーが発生した場合にエンドユーザーに表示できます。

リスト内の他のコールバックの処理をすぐに停止したい場合は$operations、各コールバックの先頭で静的変数を確認し、エラー状態の場合はコールバックをスキップする必要がある場合もあります。variable_get/ variable_set、またはページリクエスト間で持続するその他のメカニズムを使用してみてください。ただし、これは間違いなくハック/ラストリゾートソリューションです。

以下も参照してください。


0

以下のコードを試すことができますか?

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

エラーページが表示されます。残りの操作をバイパスして直進したいmymodule_batch_finished
Robbert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.