外部客户端如何使用 HTTP 回调通知 Oozie 工作流



假设我们有一个案例,Oozie工作流由3个Java操作节点启动。每个Java操作都将对Oozie/Hadoop集群外部的外部Web服务(例如 google.com,yahoo.com 等公开的某些Web服务)进行异步HTTP调用。我认为这是可行的,因为 Oozie 支持自定义操作节点。

现在,我不想让Oozie不时地轮询外部Web服务以检查工作是否在外部Web服务中完成。我想让外部Web服务(让我们假设我们可以自由修改它)回调Oozie到nofiy Oozie外部Web服务的工作已经完成,并进一步将一些信息传回Oozie,让Oozie决定采取哪些后续行动。

有一些wiki,例如这个 http://www.infoq.com/articles/ExtendingOozie,谈论异步节点的操作回调,但是我从未找到任何实际示例,异步操作节点的回调如何工作。有没有人知道异步操作节点的回调是如何工作的?

提前非常感谢!

看看Oozie SSH操作实现。它只是一个类,相对简单(但有点混乱),并展示了如何创建回调 URL:

String callbackPost = ignoreOutput ? "_" : 
getOozieConf().get(HTTP_COMMAND_OPTIONS).replace(" ", "%%%");
String callBackUrl = Services.get().get(CallbackService.class)
                .createCallBackUrl(action.getId(), EXT_STATUS_VAR);

然后将 URL 作为参数传递给 shell 脚本。脚本稍后只是在该 URL 上调用 curl。例如,外部状态 id 是已执行进程的 PID,通过回调返回给 Oozie。它不能为空/空。

如果您决定深入研究代码,则提示:虽然看起来代码是同步执行的,但实际上是通过在后台运行 shell 脚本异步执行的。

回调由Oozie的CallbackServlet处理:

dagEngine.processCallback(actionId, callbackService.getExternalStatus(queryString), props);

根据IBM DW文章

当Oozie启动任务时,它会为任务提供一个唯一的回调HTTP URL,并在任务完成时通知该URL。如果任务调用回调 URL 失败,Oozie 可以轮询任务是否完成。

CallbackService.java 具有生成回调 url 的方法,用于将其发送到操作并在操作进行回调时对其进行解析。

最新更新