我正在使用Chronicle 4.5.27来编写和阅读市场数据。 我有一个单独的作家,但有多个读者。开发操作系统是Windows,后跟Linux for Prod部署。
如何实施以下用例?
为此,我已实现但似乎由于某些未解决的问题,Windows上的文件未被删除。 CQ中是否有任何内置支持,只有所有感兴趣的消费者都可以删除文件?
public static long readMarketData(String pathForMarketDataFile, long indexFrom) {
SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(pathForMarketDataFile).rollCycle(RollCycles.MINUTELY).storeFileListener(new StoreFileListener() {
@Override
public void onReleased(int i, File file) {
System.out.println("File is not in use and is ready for deletion: " + file.getName());
try {
file.delete();
} catch (IOException e) {
e.printStackTrace();
}
;
System.out.println("File deleted: " + file.getName() );
}
@Override
public void onAcquired(int cycle, File file) {
System.out.println("File is use for reading: " + file.getName());
}
}).build();
我已经阅读了很多关于这个主题的博客和帖子,例如
https://vanilla-java.github.io/2016/03/29/Microservices-in-the-Chronicle-world-Part-4.html
https://groups.google.com/forum/#!topic/java-chronicle/0Nz5P-nvLgM
但是仍然想知道是否有人实现了这个用例。
答案 0 :(得分:1)
使用MessageHistory
执行消费者高水位线跟踪,但是,这需要您的消费者也将输出写入编年史队列(主要是将消费者读取序列存储在输出队列中)。 / p>
或者,您需要实现自己的机制来记录每个消费者看到的最高序列(索引)。
在删除文件方面,可能有其他进程保存队列文件的打开文件句柄。如果reader-A不再使用队列文件15.cq4,那么你的代码将尝试调用file.delete(),但是reader-B仍然可以引用该文件,阻止它被删除。
更强大的策略是从每个读者到另一个服务/进程的某种事件,负责在所有读者完成处理后删除文件。
答案 1 :(得分:-1)
1)如果您查看文档 https://github.com/OpenHFT/Chronicle-Queue#restartable-tailers,命名尾标将自动处理此功能。
您需要为每个阅读尾标赋予唯一的名称,例如下面代码行中的'a'
ExcerptTailer atailer = cq.createTailer("a");
tailer将其索引存储在Queue本身中,并且此索引得以维护。重新启动您的阅读服务后,索引将被选择,并且尾部将从上次阅读位置继续。
2)调用file.delete()时,该文件不会在Windows上被删除,并且在Linux上可以正常工作。 Windows锁定程序当前正在使用的文件。您无法删除应用程序当前正在使用的文件。
其他线程中提到了其他解决方案 Java 'file.delete()' Is not Deleting Specified File