好的,我举手。我的最后一个答案相当不稳定,我已将其删除。
与网站的精神保持一致,我想我会尝试不同的战术。
如果您说您将这些消息保存在单个文件中,那么您可以尝试使用文件大小创建唯一 ID 之类的方法?
在将消息写入文件之前,它的 id 可能是文件的当前大小。
如果这些消息需要在多个文件中是唯一的,您可以添加文件名 + 大小作为 id。
我会把同步的烫手山芋留到另一天。但是您可以将所有这些都包装在一个同步对象中,以跟踪事物。
另外,我假设将来不会删除写入文件的任何消息。
附加说明:您可以创建一个消息处理对象,该对象在构造时(或通过创建方法)打开文件。该对象将获取文件的初始大小,并将其用作唯一 ID。随着每条消息的添加(以同步方式),id 会随着消息的大小而增加。这将解决性能问题。如果多个 JVM/Node 访问同一个文件,将无法正常工作。
骨架理念:
public class MessageSink {
private long id = 0;
public MessageSink(String filename) {
id = ... get file size ..
}
public synchronized addMessage(Message msg) {
msg.setId(id);
.. write to file + flush ..
.. or add to stack of messages that need to be written to file
.. at a later stage.
id = id + msg.getSize();
}
public void flushMessages() {
.. open file
.. for each message in stack write ...
.. flush and close file
}
}