Airflow 从中已清除的任务获取XCOM

Airflow 从中已清除的任务获取XCOM,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,我有任务失败时的松弛警报,但我也希望有恢复消息 当任务最初失败时,在其on_failure_回调中执行xcom_推送。我在此处保存的内容可在下一次DAG运行中使用: 上下文['ti'].xcom\u pullkey='my\u task\u state', task_id=上下文['task']。task_id, 包括以前的日期=真 但是,如果我清除失败的任务以使其重新运行,则在其on_failure_回调/on_success_回调中,我尝试以下操作以获取我在初始尝试中保存的值: 上下文['t

我有任务失败时的松弛警报,但我也希望有恢复消息

当任务最初失败时,在其on_failure_回调中执行xcom_推送。我在此处保存的内容可在下一次DAG运行中使用:

上下文['ti'].xcom\u pullkey='my\u task\u state', task_id=上下文['task']。task_id, 包括以前的日期=真 但是,如果我清除失败的任务以使其重新运行,则在其on_failure_回调/on_success_回调中,我尝试以下操作以获取我在初始尝试中保存的值:

上下文['ti'].xcom\u pullkey='my\u task\u state', task_id=上下文['task']。task_id, 包括以前的日期=假 这不会返回任何值。如果我设置include_previor_dates=True,它将返回上一次DAG运行的值,但不会返回当前任务被清除的运行值

我是否做错了什么,或者是否有一种解决方法可以用来获取我要查找的XCom值?

在我的理解中:

Xcom设计用于任务之间的消息交换。 Xcom状态取决于任务实例。如果任务实例已清除,则属于此实例的xcom历史信息也将被删除

这就是为什么你会

当include_preor_dates=False时为无,任务实例已删除,没有此类xcom记录

上次dag信息当include_preor_dates=True时,任务实例已删除,但另一个dags任务实例xcome已被最新删除

以下是默认情况下的示例\u xcom:

所有成功状态: 1.1达格 1.2 xcom列表 清除一个任务状态: 2.1明确 2.2被删除的xcom列表 应该删除xcome,但我未能捕获屏幕。 这就是为什么你的计划一无所获

2.3重做xcom列表但时间戳不同,新记录 如果你发现答案是“帮助”,请投赞成票。据我所知,谢谢你:

Xcom设计用于任务之间的消息交换。 Xcom状态取决于任务实例。如果任务实例已清除,则属于此实例的xcom历史信息也将被删除

这就是为什么你会

当include_preor_dates=False时为无,任务实例已删除,没有此类xcom记录

上次dag信息当include_preor_dates=True时,任务实例已删除,但另一个dags任务实例xcome已被最新删除

以下是默认情况下的示例\u xcom:

所有成功状态: 1.1达格 1.2 xcom列表 清除一个任务状态: 2.1明确 2.2被删除的xcom列表 应该删除xcome,但我未能捕获屏幕。 这就是为什么你的计划一无所获

2.3重做xcom列表但时间戳不同,新记录 如果你发现答案是“帮助”,请投赞成票。谢谢

很好地解释了为什么我无法获得我想要的价值观。不过,我还是想出了一个解决办法

xcom_push和xcom_pull都只是在xcom上调用类方法。你可以直接打电话给他们。事实证明,您可以使用一个虚构的任务id,它会将它保存到该id下的xcom表中。因为它不是一个真正的任务,所以在清除任务或DAG时它不会被删除

从airflow.models导入XCom def set_xcomcontext,值: XCom.setkey='my_key', 价值=价值 task_id='{}u一些_后缀'.formatcontext['ti'].task_id, dag_id=上下文['ti']。dag_id, 执行日期=上下文['ti']。执行日期 def get_xcomcontext: 返回XCom.get_onecontext['ti'].执行日期, key='my_key', task_id='{}u一些_后缀'.formatcontext['ti'].task_id, dag_id=上下文['ti']。dag_id, 包括以前的日期=假 这不是使用XCom的标准方式,因此我将来升级到新版本的Airflow时必须小心。

很好地解释了为什么我无法获得想要的值。不过,我还是想出了一个解决办法

xcom_push和xcom_pull都只是在xcom上调用类方法。你可以直接打电话给他们。事实证明,您可以使用一个虚构的任务id,它会将它保存到该id下的xcom表中。因为它不是一个真正的任务,所以在清除任务或DAG时它不会被删除

从airflow.models导入XCom def set_xcomcontext,值: XCom.setkey='my_key', 价值=价值 task_id='{}u一些_后缀'.formatcontext['ti'].task_id, dag_id=上下文['ti']。dag_id, 执行日期=上下文['ti']。执行日期 def get_xcomcontext: 返回XCom.get_onecontext['ti'].执行日期, key='my_key', task_id='{}u一些_后缀'.formatcontext['ti'].task_id, dag_id=上下文['ti']。dag_id, 包括以前的日期=假 这不是使用XCom的标准方式,所以我只能小心了 l将来升级到新版本的Airflow时