将任务发布到 Web 控制台执行(管理)上下文

Posting a Task to the Web Consoles Execution(Management) Context

在 apache brooklyn 网络界面中,我们想为系统管理员显示一些内容。内容太长,无法作为简单的传感器值。

我们的想法是创建一个任务并将内容写入任务的输出流,然后像这样向管理人员提供基于 REST 的 URL: /v1/activities/{task}/stream/stdout(当然 link 被一些漂亮的文字掩盖了)

流和任务是这样创建的:

LOG.info("{} Creating Activity for ClusterReport Feed", this);
activity = Tasks.builder().
    displayName("clusterReportFeed").
    description("Output for the Cluster Report Feed").
    body(new Runnable() {
        @Override
        public void run() {
            //DO NOTHING
        }
    }).
    parallel(true).
    build();

LOG.info("{} Task Created with Id: " + activity.getId(), this);
Entities.submit(server, activity).getUnchecked();

任务似乎已创建,交互工作正常。 但是,当我想使用准备好的 URL 从浏览器访问任务输出流时,我收到任务不存在的错误。

我们的想法是我们不在正确的 Management/Execution 上下文中。与实体及其传感器相比,网页在其他上下文中 运行。我们如何放置一个任务,以便它也对 Web 控制台上下文可见。

是否可以将内容写入文件,然后通过 Jetty(布鲁克林网络服务器)提供下载?那将是一种更简单的方法。

布鲁克林的许多任务默认为瞬态 - 即它们在完成后不久就会被删除(默认情况下,效应器调用等是非瞬态的)。

您可以在使用任务生成器时使用以下代码将您的任务标记为非临时任务:

.tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)

但是,请注意(自 Brooklyn 版本 0.9.0 起)任务使用 soft references 保存在内存中。这意味着当其他内存对象需要该内存时,任务的标准输出可能会在将来的某个时候丢失。

对于您的用例,将其作为效应器结果是否有意义?

或者您可以改为写入 S3 等对象存储吗? S3 方法对我来说似乎是最好的。

将其写入文件,与布鲁克林高可用性一起使用时必须小心。您会写入共享卷吗?

如果您要写入文件,则需要提供网络扩展,以便人们可以访问该文件的内容。从 Brooklyn 0.9.0 开始,您可以在调用 BrooklynLauncher (which calls BrooklynWebServer).

时在代码中添加自己的 WAR。