0

我们有一个 Kiba 管道,我们需要在作业结束后执行一些任务,无论是否有错误(整个管道不会失败,我们只是有几个验证错误或类似错误)。

这就是文档所说的:

:warning: 如果在它们之前发生错误,则不会调用后处理器。 https://github.com/thbar/kiba/wiki/Implementing-pre-and-post-processors

这是推荐的方法吗:

Kiba.run(
  Kiba.parse do
    source(...)
    transform(...)
    destination(....)

    post_process do
      # we cannot do it here, because it won't get called
    end
  end
)

# is this the location to do it?
Job.some_special_cleanup_task

谢谢!

PS是什么意思:

如果在它们之前发生错误,则不会调用后处理器。

这是否意味着如果错误发生并且没有被救出?

4

1 回答 1

0

post_process正如您所指出的那样,如果出现错误,Indeed将不会被调用!

此时,最好的解决方案是使用一种ensure语句形式:

一种常见的结构方式是:

module ETL
  module Job
    module_function

    def setup(config)
      Kiba.parse do
        source(...)
        transform(...)
        destination(....)
      end
    end

    def some_special_cleanup_task
      # ...
    end

    def run(job)
      Kiba.run(job)
    ensure
      Job.some_special_cleanup_task
    end
  end
end

这样做可以将始终运行的任务的代码保持在 ETL 作业附近,这很好。

如果您的任务与作业非常独立,并且您希望鼓励作业之间的重用,您还可以创建一个通用的块形式组件:

module ETL
  module Middlewares
    module CommonTask
      module_function

      def with_common_task
        yield
      ensure
        do_the_common_task
      end
    end
  end
end

你会像这样使用它:

ETL::Middlewares::CommonTask.with_common_task do
  Kiba.run(...)
end

例如, Kiba Pro FileLock使用第二种形式。

未来,Kiba ETL 将引入一种中间件形式,使这变得更加容易。

希望这会有所帮助,如果它正确解决了您的问题,请将问题标记为已回答!

于 2020-07-02T08:27:47.813 回答