0

いくつかの連続したアクションを実行する Rhino ETL プロセスがあります。その最初のアクションは、SQL Server データベースに移動していくつかの行を取得することです (つまり、プロセス全体の「抽出」部分)。

EtlProcessこの段階で行が返されなかった場合は、爆弾を作成したいと思います。これについてどうすればいいですか?私はオーバーライドを試してみましたが、爆撃すべきOnFinishedProcessing()であることを知らせる明確な方法がわかりません。EtlProcess

私がこれまでに持っているもの:

protected override void OnFinishedProcessing(IOperation op)
{
    var sqlExtractionOperation = op as SqlExtractionOperation;
    if (sqlExtractionOperation != null)
    {
        if (sqlExtractionOperation.Statistics.OutputtedRows == 0)
        {
            //TODO: figure out how to make it stop here
        }
    }

    base.OnFinishedProcessing(op);
}
4

1 に答える 1

2

私にとっての解決策はEtlProcess、シングルスレッドモードで実行するように指示することでした。

デフォルトでは、各 Rhino ETL 操作は個別のワーカー スレッドで実行されます。つまり、個々の操作によって発生した例外はデフォルトで飲み込まれます。(キューに入れられたワーカースレッドは、互いのデータが通過するのを順番に待ちます - 少なくとも、それは私がソースのちょっとしたデバッグから得たものです)

シングル スレッド モードで実行するEtlProcessには、コンストラクターに次のコードを追加します。

PipelineExecuter = new SingleThreadedPipelineExecuter();

プロセスの操作の中で例外をスローすると、プロセス全体が爆破されます。をオーバーライドすることで、プロセスの最後にエラーを記録できますPostProcessing()

protected override void PostProcessing()
{
    base.PostProcessing();

    if (!PipelineExecuter.HasErrors)
        Info("Process completed successfully");
    else
        Warn("Process failed");
}
于 2014-02-05T11:53:04.127 に答える