Rhino ETL - 取消EtlProcess部分通过

时间:2014-02-04 10:22:11

标签: c# rhino-etl

我有一个Rhino ETL进程,它执行多个顺序操作,第一个是转到SQL Server数据库并检索一些行(即"提取"整个过程的一部分)。 / p>

如果在此阶段没有返回任何行,我想要发出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);
}

1 个答案:

答案 0 :(得分: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");
}