Chronicle Queue - 从最后读取位置读取并删除所有消费者读取的文件

时间:2017-11-13 11:27:15

标签: chronicle chronicle-queue

我正在使用Chronicle 4.5.27来编写和阅读市场数据。 我有一个单独的作家,但有多个读者。开发操作系统是Windows,后跟Linux for Prod部署。

如何实施以下用例?

  1. 如何从上次阅读位置开始阅读队列?例如如果读者已从一个文件中读取了15条记录,该文件有100条记录并且已经停止/停止如何从下次重启后的第16条记录开始读取? CQ中是否有内置的持久支持?
  2. 删除所有使用者读取的文件以节省磁盘空间。
  3. 为此,我已实现但似乎由于某些未解决的问题,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

    但是仍然想知道是否有人实现了这个用例。

2 个答案:

答案 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