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 回答