2016-04-11 7 views
0

Im Apache Brooklyn Webinterface möchten wir einige Inhalte für die Systemmanager anzeigen. Der Inhalt ist zu lang, um als einfacher Sensorwert verwendet zu werden.Eine Aufgabe in den Webkonsolen-Ausführungsmodus (Management) schreiben Kontext

Unsere Idee war es, eine Aufgabe zu erstellen und den Inhalt in den Ausgabestream der Aufgabe zu schreiben und dann den Managern die REST-basierte URL wie folgt anzubieten: /v1/activities/{task}/stream/stdout (natürlich ist die Verbindung mit einigen netten Text maskiert)

der Stream und Aufgabe wird wie folgt erstellt:

scheint
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(); 

die Aufgabe geschaffen werden und die interraction arbeitet völlig in Ordnung. Wenn ich jedoch über eine vorbereitete URL auf den Aufgaben-Ausgabestream von meinem Browser aus zugreifen möchte, erhalte ich den Fehler, dass die Aufgabe nicht existiert.

Unsere Idee ist, dass wir nicht im richtigen Management/Ausführungskontext sind. Die Webseite läuft in einem anderen Kontext als die Entitäten und ihre Sensoren. Wie können wir eine Aufgabe so platzieren, dass sie auch für den Kontext der Webkonsolen sichtbar ist?

Ist es möglich, den Inhalt in eine Datei zu schreiben und dann über Jetty (Brooklyns-Webserver) zum Download anzubieten? Das wäre ein viel einfacherer Weg.

Antwort

0

Viele Aufgaben in Brooklyn sind standardmäßig vorübergehend - d. H. Sie werden gelöscht, kurz nachdem sie abgeschlossen sind (Dinge wie Effektoraufrufe sind standardmäßig nicht flüchtig).

Sie können Ihre Aufgabe als nicht-transient mit dem Code unten in Ihre Nutzung der Aufgabe Builder markieren:

.tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG) 

Beachten Sie jedoch, dass (wie von Brooklyn Version 0.9.0) Aufgaben gehalten werden in- Speicher unter Verwendung soft references. Dies bedeutet, dass die Standardausgabe der Aufgabe wahrscheinlich zu irgendeinem Zeitpunkt in der Zukunft verloren geht, wenn dieser Speicher für andere speicherinterne Objekte benötigt wird.

Für Ihren Anwendungsfall wäre es vielleicht sinnvoll, dies als Effektorergebnis zu haben?

Oder könnten Sie stattdessen in einen Objektspeicher wie S3 schreiben? Der S3-Ansatz würde mir am besten erscheinen.

Zum Schreiben in eine Datei muss bei Verwendung mit Brooklyn-Hochverfügbarkeit vorsichtig vorgegangen werden. Würden Sie auf ein freigegebenes Volume schreiben?

Wenn Sie in eine Datei schreiben, müssen Sie eine Web-Erweiterung bereitstellen, damit Benutzer auf den Inhalt dieser Datei zugreifen können. Ab Brooklyn 0.9.0 können Sie Ihre eigenen WARs in Code hinzufügen, wenn Sie BrooklynLauncher aufrufen (die BrooklynWebServer aufruft).