我不想使用记录器或数据库服务器,而是希望将信息附加到可能很多Verticle实例中的一个文件中。
有一些版本的方法可以异步写入文件。 我可以假设vertx处理写入之间的同步,以便在使用标记为“异步”的那些版本的方法时这些不会干扰吗? 似乎有一个规则,人们可以依赖vertx提供开箱即用的并发处理之间的所有隔离。但是在写文件访问的情况下是这样吗?
请您在答案中包含一个代码段,其中显示了如何从具有最佳粒度的许多Verticle实例中打开和写入一个文件,例如:用于记录请求。
答案 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());
}
});