如何在 vert.x 3.2 中从多个 Verticle 实例安全地写入一个文件?

How to safely write to one file from many verticle instances in vert.x 3.2?

我不想使用记录器或数据库服务器,而是想将可能来自多个 Verticle 实例的信息附加到一个文件。

有多种版本的异步写入文件的方法。 我可以假设 vertx 处理写入之间的同步,以便在使用标记为“async”的那些版本的方法时这些不会干扰吗? 似乎有一条规则可以依赖 vertx 提供开箱即用的并发处理之间的所有隔离。但是在写文件访问的情况下是这样吗?

您能否在答案中包含一个代码片段,说明如何以尽可能细的粒度从许多 Verticle 实例中打开和写入一个文件,例如用于记录请求。

我不建议写入包含许多不同 "writers" 的单个文件。关于并发日志记录,我会坚持单一作者原则。

创建一个订阅事件总线并监听要记录的消息的 Verticle。让我们将这个监听 system.logger.

的 Verticle 称为 Logger
EventBus eb = vertx.eventBus();

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

喜欢记录内容的 Verticles 需要向 Logger Verticle 发送消息:

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

附加到现有文件的工作方式如下(未测试):

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