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

时间:2016-04-09 12:44:13

标签: vertx3 vert.x

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

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

请您在答案中包含一个代码段,其中显示了如何从具有最佳粒度的许多Verticle实例中打开和写入一个文件,例如:用于记录请求。

1 个答案:

答案 0 :(得分:2)

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

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

EventBus eb = vertx.eventBus();

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

喜欢记录内容的Verticle需要向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());
    }
});