我有一个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);
}
答案 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");
}