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



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

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

请在答案中包含一段代码片段,展示如何以尽可能细的粒度打开和写入多个垂直实例中的一个文件,例如记录请求。

我不建议使用许多不同的"编写器"对单个文件进行编写。关于并发日志记录,我将坚持单写器原则。

创建一个Verticle,订阅事件总线并侦听要记录的消息。让我们调用这个Verticle Logger,它侦听system.logger

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

想要记录东西的顶点需要向Logger顶点发送消息:

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

最新更新