我想在管道完成所有处理后运行一些代码,因此我使用BlockingDataflowPipelineRunner
并在pipeline.run()
main
之后放置代码。
当我使用BlockingDataflowPipelineRunner
从命令行运行作业时,这可以正常工作。管道完成处理后,pipeline.run()
下的代码运行。
但是,当我尝试将作业作为模板运行时,它不起作用。我将作业部署为模板(使用TemplatingDataflowPipelineRunner
),然后尝试在云函数中运行模板,如下所示:
dataflow.projects.templates.create({
projectId: 'PROJECT ID HERE',
resource: {
parameters: {
runner: 'BlockingDataflowPipelineRunner'
},
jobName: `JOB NAME HERE`,
gcsPath: 'GCS TEMPLATE PATH HERE'
}
}, function(err, response) {
if (err) {
// etc
}
callback();
});
跑步者似乎没有。我可以在跑步者身上乱搞,工作仍在继续。
我在pipeline.run()
下的代码在每个作业运行时都不会运行 - 它只在我部署模板时运行。
预计每次作业运行时pipeline.run()
main
下的代码都不会运行吗?在管道完成后是否有执行代码的解决方案?
(对于上下文,pipeline.run()
之后的代码将文件从一个云存储桶移动到另一个云存储桶。它正在归档刚刚由作业处理的文件。)
答案 0 :(得分:2)
是的,这是预期的行为。模板表示管道本身,并通过启动模板允许(重新)执行管道。由于模板不包含main()
方法中的任何代码,因此在管道执行后它不允许执行任何操作。
同样,dataflow.projects.templates.create
API只是启动模板的API。
阻塞运行器完成此操作的方式是从创建的管道中获取作业ID,并定期轮询以观察何时完成。对于您的用例,您需要执行相同的操作:
dataflow.projects.templates.create(...)
以创建数据流作业。这应该返回作业ID。dataflow.projects.jobs.get(...)
以检索具有给定ID的作业,并检查它所处的状态。