0

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

我们的想法是创建一个任务并将内容写入任务的输出流,然后向管理器提供基于 REST 的 URL,如下所示:/v1/activities/{task}/stream/stdout(当然链接被屏蔽有一些不错的文字)

流和任务是这样创建的:

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 从浏览器访问任务输出流时,我收到任务不存在的错误。

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

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

4

1 回答 1

0

布鲁克林的许多任务默认是瞬态的——即它们在完成后不久就被删除(像效应器调用这样的事情默认是非瞬态的)。

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

.tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)

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

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

或者你可以写一个对象存储,比如 S3 吗?S3 方法对我来说似乎是最好的。

要将其写入文件,在使用 Brooklyn 高可用性时必须小心。您会写入共享卷吗?

如果您确实写入文件,那么您需要提供网络扩展,以便人们可以访问该文件的内容。从 Brooklyn 0.9.0 开始,您可以在调用BrooklynLauncher(调用BrooklynWebServer)时在代码中添加自己的 WAR 。

于 2016-06-06T11:08:00.277 回答