如何配置ADF Pipeline B,使其仅在Pipeline A未运行时执行?
解决ADF中Pipeline A与B的Blob冲突问题
方案1:给Pipeline B的翻滚窗口触发器加运行条件
直接在B的触发器层面做限制,只有当Pipeline A未处于运行状态时才触发:
- 打开Pipeline B的翻滚窗口触发器配置,找到「触发条件」模块
- 输入条件表达式:
@not(contains(pipeline('Pipeline A').status, 'Running')) - 每次触发器到点时,会先检查A的状态,只要A处于运行中,就不会触发B的本次窗口运行
方案2:在Pipeline B内部加等待逻辑
如果触发器层面的限制不够灵活,就在B的流程开头添加判断等待逻辑:
- 给B添加一个「Until」活动,设置终止条件为
@not(contains(pipeline('Pipeline A').status, 'Running')) - 在Until活动内部添加一个「Wait」活动,设置等待时长(比如5分钟)
- B被触发后,会循环检查A的状态,直到A停止运行,才会继续执行后续的清理操作
方案3:用Blob元数据做状态标记
通过给Blob X添加自定义元数据,标记是否正在被A处理:
- 在Pipeline A的开头添加「Set Blob Metadata」活动,给Blob X设置元数据
IsProcessing = 'true' - 在A的结尾(需覆盖成功、失败所有分支)再用「Set Blob Metadata」将
IsProcessing修改为false - 在Pipeline B的开头添加「Get Blob Metadata」活动,获取Blob X的元数据
- 添加「If Condition」活动,判断
@equals(activity('Get Blob Metadata').output.metadata.IsProcessing, 'false'):- 满足条件则继续执行清理操作;不满足的话,添加「Wait」活动等待10分钟后重新检查,直到标记为
false再继续
- 满足条件则继续执行清理操作;不满足的话,添加「Wait」活动等待10分钟后重新检查,直到标记为
额外提醒
因为B使用的是翻滚窗口触发器且失败会自动重试,若采用方案1,触发器条件不满足时不会触发B,此时翻滚窗口的重试机制不会生效——如果需要确保每个窗口的B都能执行,更推荐方案2或3,让B触发后先等待A完成,再执行操作,避免因冲突导致失败重试。
内容的提问来源于stack exchange,提问作者Sushant Pachipulusu
相关产品推荐
相关产品推荐

