繁体   English   中英

在Chronicle Queue Tailer(v5.16.11)中阅读消息不会自动将索引移动到下一个滚动周期

Reading messages in Chronicle Queue Tailer (v5.16.11) does not auto-move the index to next roll cycle

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我使用CQ v5.16.11(带有openjdk 11)来保存每天滚动周期的数据。 该过程从星期日到星期五不间断运行,因此我每周有5个cq4文件。 我将流程运行了1.5周,共有8个文件(第1周3个文件,第2周5个文件)。

所以我拥有的文件是:

20181003.cq4 cycle=17807,
20181004.cq4 cycle=17808,
20181005.cq4 cycle=17809,
20181007.cq4 cycle=17811,
20181008.cq4 cycle=17812,
20181009.cq4 cycle=17813,
20181010.cq4 cycle=17814,
20181011.cq4 cycle=17815,

请注意缺少20181006.cq4的文件(cycle = 17810),因为该过程不在周六运行。

我使用以下代码读取数据:

tailer.toEnd();
lastTailerIndex = tailer.index();
tailer.toStart();

while (tailer.index() <= lastTailerIndex) {
    // read data
    if (tailer.readBytes(data) {
     /// do something with data bytes
    }
    if (tailer.index() == lastTailerIndex) {
        break;
    }
}

这样可以正确读取第一周的数据,但不会读取第二周的数据,因为它不会自动滚动到下一个周期。

知道为什么会这样或如何解决吗?

问题类似于旧版本的问题

日志:

2018-10-12 12:41:15,784 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/metadata.cq4t took 19.237 ms.
2018-10-12 12:41:15,876 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/20181011.cq4 took 0.063 ms.
2018-10-12 12:41:15,881 DEBUG [main] net.openhft.chronicle.queue.impl.single.PretoucherState - /site/data/20181011.cq4 - Reset pretoucher to pos 4835096 as the underlying MappedBytes changed.
2018-10-12 12:41:15,887 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/20181003.cq4 took 0.065 ms.
2018-10-12 12:41:15,995 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/20181011.cq4 took 0.082 ms.
2018-10-12 12:41:15,996 DEBUG [main] net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder - File released /site/data/20181003.cq4
2018-10-12 12:41:15,997 DEBUG [main] net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder - File released /site/data/20181011.cq4
2018-10-12 12:41:16,418 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/20181004.cq4 took 0.112 ms.
2018-10-12 12:41:16,418 DEBUG [main] net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder - File released /site/data/20181003.cq4
2018-10-12 12:41:16,813 DEBUG [main] net.openhft.chronicle.bytes.MappedFile - Allocation of 0 chunk in /site/data/20181005.cq4 took 0.084 ms.
2018-10-12 12:41:16,813 DEBUG [main] net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder - File released /site/data/20181004.cq4

[编辑1]:在上周末发生了同样的事情,即,按预期,10月13日没有新文件。现在,我有10月7日至10月15日的文件(缺少10月13日的文件)。 如果我做tailer.toStart(); while(tailer.readBytes() { ...} tailer.toStart(); while(tailer.readBytes() { ...}仅读取从10月7日到10月12日的文件,而不读取10月14日和15日。

[编辑2]:复制了以下问题,如 Chronicle-Queue / issues / 537

  1. 设置/库: jvm openjdk 11,Ubuntu 16.04,openhft.affinity / 3.1.9,编年史地图/3.16.0,编年史队列/5.16.11,编年史字节数/1.16.23,编年史核心/1.16.20 ,编年史钢丝/1.16.16,编年史线程/1.16.3,jna / 4.4.0
  2. 脚步:
    • 启动WriterProcess-让它完成。
    • 启动ReaderProcess-请参阅5条打印语句。
    • 停止ReaderProcess
    • 等待一段时间-10分钟。
    • 再次启动WriterProcess-让它完成或继续运行此过程。
    • 启动ReaderProcess-它仅打印前5个打印语句,此后不打印任何内容。 即使WriterProcess正在运行/正在写入队列,该进程中的尾文件也不会向前移动。

public class WriterProcess {
        public static void main(String[] args) throws InterruptedException {
            final String dir = "/tmp/demo/";
            final LocalTime localTime = LocalTime.of(17, 0);
            final ZoneId zoneID = ZoneId.of("America/New_York");
            final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
            final SingleChronicleQueue queue  = SingleChronicleQueueBuilder.binary(dir)
                    .blockSize((long) Math.pow(2, 23))
                    .rollCycle(RollCycles.MINUTELY)
                    .rollTime(localTime, zoneID)
                    .build();
            final ExcerptAppender appender = queue.acquireAppender();
            // pre touch
            scheduledExecutorService.scheduleAtFixedRate(appender::pretouch,0,30, TimeUnit.SECONDS);
            // write data
            System.out.println("writing data ...");
            writeData(appender, 5);
            // close queue
            System.out.println("shutting down now ...");
            queue.close();
            scheduledExecutorService.shutdown();
            scheduledExecutorService.awaitTermination(1, TimeUnit.SECONDS);
        }
        public static void writeData(ExcerptAppender appender, int count) {
            int ctr = 0;
            String dateStr;
            Date date = new Date();
            while (true) {
                dateStr = date.toString();
                appender.writeText("["+ctr+"] Written " + dateStr);
                System.out.println("["+ctr+"] Written " + dateStr);
                ctr++;
                if (ctr >= count) {
                    break;
                }
                try {
                    Thread.sleep(65_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public class ReaderProcess {
        public static void main(String[] args) {
            final String dir = "/tmp/demo/";
            final LocalTime localTime = LocalTime.of(17, 0);
            final ZoneId zoneID = ZoneId.of("America/New_York");
            final SingleChronicleQueue queue  = SingleChronicleQueueBuilder.binary(dir)
                    .blockSize((long) Math.pow(2, 23))
                    .rollCycle(RollCycles.MINUTELY)
                    .rollTime(localTime, zoneID)
                    .build();
            final ExcerptTailer tailer = queue.createTailer();
            tailer.toStart();
            // read data
            System.out.println("reading data ...");
            readData(tailer, 25);
            // close
            System.out.println("shutting down now ...");
            queue.close();
        }
        public static void readData(ExcerptTailer tailer, int count) {
            int ctr = 0;
            Bytes data = Bytes.allocateDirect(new byte[500]);
            while (true) {
                if (tailer.readBytes(data)) {
                    System.out.println("["+ctr+"] Read {"+ data + "}");
                    ctr++;
                    if (ctr >= count) {
                        break;
                    }
                }
            }
        }
    }
1 个回复

我编写了一个稍微更简单的版本,该版本可用于chrono-bom 2.17及其使用的版本。 我所做的最大更改是在读取data之前清除了Bytes data ,否则仅追加data ,以免覆盖任何内容。

import net.openhft.chronicle.bytes.Bytes;
import net.openhft.chronicle.core.OS;
import net.openhft.chronicle.queue.ExcerptAppender;
import net.openhft.chronicle.queue.ExcerptTailer;
import net.openhft.chronicle.queue.RollCycles;
import net.openhft.chronicle.queue.impl.single.SingleChronicleQueue;
import net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder;

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class WriterProcess {
    static final String dir = OS.TMP + "/demo-" + System.nanoTime() + "/";

    public static void main(String[] args) throws InterruptedException {
        final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        final SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(dir)
                .testBlockSize()
                .rollCycle(RollCycles.TEST_SECONDLY)
                .build();
        final ExcerptAppender appender = queue.acquireAppender();
        // pre touch
        scheduledExecutorService.scheduleAtFixedRate(appender::pretouch, 3, 30, TimeUnit.SECONDS);
        new Thread(ReaderProcess::main).start();
        // write data
        System.out.println("writing data ...");
        writeData(appender, 100);
        // close queue
        System.out.println("shutting down now ...");
        queue.close();
        scheduledExecutorService.shutdown();
        scheduledExecutorService.awaitTermination(1, TimeUnit.SECONDS);
    }

    public static void writeData(ExcerptAppender appender, int count) {
        int ctr = 0;
        while (true) {
            LocalDateTime date = LocalDateTime.now();
            appender.writeText("[" + ctr + "] Written " + date);
            System.out.println("[" + ctr + "] Written " + date);
            ctr++;
            if (ctr >= count) {
                break;
            }
            try {
                Thread.sleep(2_200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class ReaderProcess {
    public static void main(String... args) {
        final String dir = WriterProcess.dir;
        final SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(dir)
                .testBlockSize()
                .rollCycle(RollCycles.TEST_SECONDLY)
                .build();
        final ExcerptTailer tailer = queue.createTailer();
        tailer.toStart();
        // read data
        System.out.println("reading data ...");
        readData(tailer, 100);
        // close
        System.out.println("shutting down now ...");
        queue.close();
    }

    public static void readData(ExcerptTailer tailer, int count) {
        int ctr = 0;
        Bytes data = Bytes.allocateDirect(64);
        while (true) {
            data.clear();
            if (tailer.readBytes(data)) {
                System.out.println("[" + ctr + "] Read {" + data + "}");
                ctr++;
                if (ctr >= count) {
                    break;
                }
            }
        }
    }
}
4 自动移动到下一个输入

如图所示,我有很多&lt;input&gt;最多接受三个字符。 &lt;input type="text" id="0" maxlength="3"/&gt; &lt;input type="text" id="1" maxlength="3"/&gt; &lt;input type="text" ...

5 如何在Swift中自动移动到下一个UITextField

我有2个带有NumberPad键盘类型的textFields 我想在myTextField中输入两个数字之后自动移动到另一个文本字段(从ourTextField到forTheTeTextField)然后转到另一个文本字段(forThemTextField)并输入2个数字我希望键盘自动隐藏 ...

6 滚动时自动滚动到下一个div

因此,我看到了一些带有精美脚本的主页,这些脚本将滚动动作作为自动滚动到下一个div。 这是我更好的意思:您从英雄部分开始,然后当您使用滚动向下滚动页面时,脚本强制首页将自身锁定到下一个div中,让英雄2平滑动画,是否为此提供了某种插件,或者任何人都可以友好地发布执行此操作的脚本? 谢谢。 ...

9 自动向下滚动到下一个元素

我正在尝试为我们网站的客户制作RSS提要,以查看新闻。 我的想法是,我希望有一个缓慢且平滑的向下滚动动画,目的只是为了消除可见div元素中未显示的新闻。 包含所有这些文章的元素具有设定的高度,并具有其自己的垂直滚动条。 文章的高度为:100px;宽度为:100%,并具有其唯一的ID,但是根 ...

10 回收者视图自动滚动到下一个项目

我想在“ Recycler”视图中完成视频播放后自动滚动到下一个项目。 我有2个嵌套的Recycler视图。 第一个垂直滚动,第二个水平滚动。 在这里,我正在使用exo播放器库在2nd Recycler视图中播放视频。 我只想在视频停止播放时滚动到下一个位置并开始播放视频。 我的逻辑在起作用,但 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM