在配置时间后以编程方式终止订阅中的 PubSubIO.readMessages?

Posted

技术标签:

【中文标题】在配置时间后以编程方式终止订阅中的 PubSubIO.readMessages?【英文标题】:Programmatically terminating PubSubIO.readMessages from Subscription after configured time? 【发布时间】:2019-01-12 10:58:51 【问题描述】:

我希望从 PubSub 主题的订阅中安排具有 PubSubIO.readString 的数据流。我怎样才能让工作在配置的时间间隔后终止?我的用例不是让作业运行一整天,因此希望安排开始,然后在作业中配置的间隔后停止。

Pipeline
    .apply(PubsubIO.readMessages().fromSubscription("some-subscription"))

【问题讨论】:

【参考方案1】:

来自docs:

如果您需要停止正在运行的 Cloud Dataflow 作业,您可以通过 使用 Cloud Dataflow 监控接口发出命令 或 Cloud Dataflow 命令行界面。

我假设您对通过控制台手动停止作业不感兴趣,这为您留下了命令行解决方案。如果您打算安排您的数据流作业运行,例如每天,然后你知道你希望它在什么时候停止(启动时间+“配置的间隔”)。在这种情况下,您可以配置一个 cron 作业以在每天的那个时间运行 gcloud dataflow jobs cancel。例如,以下脚本将取消当天启动的所有活动作业:

#!/bin/bash
gcloud dataflow jobs list --status=active --created-after=-1d \
| awk 'print $1;' | tail -n +2 \
| while read -r JOB_ID; do gcloud dataflow jobs cancel $JOB_ID; done

另一种解决方案是使用Runtime.getRuntime.exec() 在您的Java 代码中调用gcloud 命令。您可以使用java.util.Timer().schedule() 安排它在特定时间间隔后运行,如here 所述。这样,无论您何时启动,您都可以确保您的作业在提供的时间间隔后停止。

更新

@RoshanFernando 在 cmets 中正确指出实际上有一个 SDK method 来取消管道。

【讨论】:

你能分享一些在java代码中调用gcloud命令的例子吗? 我还找到了使用其内置管道作业 API 以编程方式调用取消/排水的选项。再次感谢。

以上是关于在配置时间后以编程方式终止订阅中的 PubSubIO.readMessages?的主要内容,如果未能解决你的问题,请参考以下文章

病毒扫描后以编程方式移动文件

如何在设备旋转后以编程方式创建的 UIButtons 保持在屏幕底部?

获取 json 数据后以编程方式设置 UITableViewCell 高度

iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束

定义状态变量后以编程方式推送视图

Apple Watch 应用程序在启动应用程序后以编程方式将视图滚动到顶部