2016-04-09 7 views
0

Anstatt einen Logger oder Datenbankserver zu verwenden, möchte ich Informationen an eine Datei von möglicherweise vielen vertikalen Instanzen anhängen.Wie kann man in vert.x 3.2 aus vielen verticle-Instanzen sicher in eine Datei schreiben?

Es gibt Versionen von Methoden zum asynchronen Schreiben in eine Datei. Kann ich davon ausgehen, dass vertx die Synchronisation zwischen den Schreibvorgängen übernimmt, so dass diese bei Verwendung der als "asynchron" markierten Methodenversionen nicht stören? Es scheint eine Regel zu geben, dass man sich darauf verlassen kann, dass vertx die gesamte Isolation zwischen der gleichzeitigen Verarbeitung aus der Box bietet. Aber gilt das für den Fall, dass ein Dateizugriff erfolgt?

Könnten Sie bitte ein Code-Snippet in die Antwort einfügen, das zeigt, wie man von vielen verticle-Instanzen mit feinstmöglicher Granularität, z. zum Protokollieren von Anfragen.

+0

Haben Sie versucht, dies zu tun? Was passiert, wenn Sie versuchen, mit mehreren Verticles in die Datei zu schreiben? – Will

Antwort

1

Ich würde nicht empfehlen, in eine einzelne Datei mit vielen verschiedenen "Writern" zu schreiben. In Bezug auf die gleichzeitige Protokollierung bleibe ich beim Single-Writer-Prinzip.

Erstellen Sie ein Verticle, das den Event Bus abonniert und auf zu protokollierende Nachrichten wartet. Lassen Sie uns diese Verticle Logger nennen, die auf system.logger hört.

EventBus eb = vertx.eventBus(); 

eb.consumer("system.logger", message -> { 
    // write to file 
}); 

Verticles, die etwas anmelden möchten müssen eine Nachricht an den Logger Verticle senden:

eventBus.send("system.logger", "foobar"); 

Anfügen an eine vorhandene Datei Arbeit so etwas wie dieses (nicht getestet):

vertx.fileSystem().open("file.log", new OpenOptions(), result -> { 
    if (result.succeeded()) { 
     Buffer buff = Buffer.buffer(message); // message from consume 

     AsyncFile file = result.result(); 
     file.write(buff, buff.length() * i, ar -> { 
      if (ar.succeeded()) { 
       System.out.println("done"); 
      } else { 
       System.err.println("write failed: " + ar.cause()); 
      } 
     }); 
    } else { 
     System.err.println("open file failed " + result.cause()); 
    } 
});