0

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

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

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

4

1 回答 1

2

我不建议使用许多不同的“作家”写入单个文件。关于并发日志,我会坚持 Single Writer 原则。

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

EventBus eb = vertx.eventBus();

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

喜欢记录某些东西的 Verticle 需要向LoggerVerticle 发送消息:

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());
    }
});
于 2016-04-19T19:51:57.647 回答