Spring Boot集成chronicle queue快速入门demo

1.chronicle queue介绍

Chronicle Queue使用一个内存映射文件来持久化每一条消息。这使我们能够在进程之间共享消息。它直接将数据存储到堆外内存,因此,使其没有GC开销。它被设计用来为高性能应用程序提供低延迟的消息框架。使用开源的Chronicle Queue可以创建巨大的持久队列,同时保持可预测和一致的低延迟。

Chronicle Queue有三个概念的特点。

  • Excerpt – is a data container

  • Appender – appender is used for writing data

  • Trailer – is used for sequentially reading data

我们将使用Chronicle接口为读写操作保留这部分内存。

创建queue

 
File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();

我们将需要一个基础目录,队列将在内存映射的文件中持久保存记录。

ChronicleQueueBuilder类提供不同类型的队列。在这种情况下,我们使用了IndexedChronicleQueue,它使用顺序索引来维护队列中记录的内存偏移。

向队列写东西。

为了将项目写入队列,我们需要使用Chronicle实例创建一个ExcerptAppender类的对象。下面是向队列中写入消息的示例代码。

下面是向队列中写入消息的示例代码。

 
ExcerptAppender appender = chronicle.createAppender();
appender.startExcerpt();String stringVal = "Hello World";
int intVal = 101;
long longVal = System.currentTimeMillis();
double doubleVal = 90.00192091d;appender.writeUTF(stringValue);
appender.writeInt(intValue);
appender.writeLong(longValue);
appender.writeDouble(doubleValue);
appender.finish();

创建appender后,我们将使用startExcerpt方法启动appender。它以默认的消息容量128K启动一个Excerpt。我们可以使用startExcerpt的重载版本来提供一个自定义容量。

一旦启动,我们可以使用库中提供的各种写法将任何文字或对象值写到队列中。

最后,当我们写完后,我们将完成摘录,把数据保存到队列中,以后再保存到光盘中。

从队列中读取信息

使用ExcerptTrailer实例可以轻松地从队列中读取值。

它就像我们在Java中用来遍历一个集合的迭代器。

让我们从队列中读取数值。

 
ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {tailer.readUTF();tailer.readInt();tailer.readLong();tailer.readDouble();
}
tailer.finish();

在创建完预告片后,我们使用nextIndex方法来检查是否有新的摘录可以阅读。一旦ExcerptTailer有一个新的Excerpt要读取,我们可以使用一系列的read方法来读取字面和对象类型值的信息。

2.代码工程

目标是创建一个持久、并发、低延迟、可从多个进程访问并且可以容纳数十亿个对象的队列

pom.xml

 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>Chronicle-Queue</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>net.openhft</groupId><artifactId>chronicle-queue</artifactId><version>5.25ea12</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency></dependencies>
</project>

entity

 
package com.et.chronicle.queue.entity;import net.openhft.chronicle.wire.Marshallable;/*** 该类实现 `net.openhft.chronicle.wire.Marshallable` 并覆盖 `toString` 方法以实现更高效的序列化*/
public class Person implements Marshallable {private String name;private int    age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person() {super();}@Overridepublic String toString() {return Marshallable.$toString(this);}
}

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

测试文本

 
package com.et.chronicle.queue;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import net.openhft.chronicle.core.OS;
import net.openhft.chronicle.queue.ChronicleQueue;
import net.openhft.chronicle.queue.ExcerptAppender;
import net.openhft.chronicle.queue.ExcerptTailer;
import net.openhft.chronicle.queue.RollCycles;class TestQueueMain {ChronicleQueue queue;@BeforeEachvoid setUp() throws Exception {String basePath = OS.getTarget() + "/Queue1";queue = ChronicleQueue.singleBuilder(basePath).rollCycle(RollCycles.FIVE_MINUTELY).build();}@AfterEachvoid tearDown() throws Exception {queue.close();}/*** 测试最简单的写入字符串*/@Testvoid testWtite() {ExcerptAppender appender = queue.acquireAppender();try {for (int i = 0; i < 50000; i++) {appender.writeText("Hello World(hello world)!--" + i);}} finally {appender.close();}}/*** 测试最简单的读取字符串*/@Testvoid testRead() {ExcerptTailer tailer = queue.createTailer("reader1"); //@wjw_note: 如果是createTailer()方法,没有给定名称,会一直能读到最后的数据而不会移动索引try {String readText = null;while ((readText = tailer.readText()) != null) {System.out.println("read: " + readText);}} finally {tailer.close();}}}

测试对象

 
package com.et.chronicle.queue;import com.alibaba.fastjson.JSONObject;
import com.et.chronicle.queue.entity.Person;
import com.fasterxml.jackson.databind.util.JSONPObject;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import net.openhft.chronicle.core.OS;
import net.openhft.chronicle.queue.ChronicleQueue;
import net.openhft.chronicle.queue.ExcerptAppender;
import net.openhft.chronicle.queue.ExcerptTailer;
import net.openhft.chronicle.queue.RollCycles;class TestQueueObject {ChronicleQueue queue;@BeforeEachvoid setUp() throws Exception {String basePath = OS.getTarget() + "/QueueDocument";queue = ChronicleQueue.singleBuilder(basePath).rollCycle(RollCycles.FIVE_MINUTELY).build();}@AfterEachvoid tearDown() throws Exception {queue.close();}/*** 测试读写实现了Marshallable接口的对象*/@Testvoid testMarshallable() {ExcerptAppender appender = queue.acquireAppender();try {for (int i = 0; i < 5; i++) {Person person = new Person();person.setName("Rob");person.setAge(40 + i);appender.writeDocument(person);}} finally {appender.close();}ExcerptTailer tailer = queue.createTailer("reader1");try {Person person2 = new Person();while (tailer.readDocument(person2)) {System.out.println(JSONObject.toJSON(person2));}} finally {appender.close();}}
}

4.引用

  • https://www.baeldung.com/java-chronicle-queue

  • http://www.liuhaihua.cn/archives/710334.html

  • https://chronicle.software/quick-start/?product=queue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQL】1407. 排名靠前的旅行者

题目描述 leetcode题目&#xff1a;1407. 排名靠前的旅行者 Code 写法一 先过滤&#xff0c;再连表 -- 写法一&#xff1a;先过滤再连表 select name, ifnull(summ, 0) as travelled_distance from Users left join(select user_id, sum(distance) as summfrom Ridesgroup …

kubernetes K8s的监控系统Prometheus安装使用(一)

简单介绍 Prometheus 是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做…

网络安全知识核心之RIP的工作原理

RIP 动态路由选择协议&#xff08;网络层协议&#xff09; RIP 是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;它使用跳数&#xff08;Hop Count&#xff09;作为度量来衡量到达目的网络的路由距离。RIP 通过 UDP 报文进行路由信息的交换&…

前端工程化的理解

简单来说&#xff0c;前端工程化是对前端开发流程的改良&#xff0c;是效率工具。 可以通过一下四个块来理解前端工程化 模块化&#xff1a; 就是将代码拆分&#xff0c;分成独立的单独的相互依赖的片段 首先说JS&#xff0c;CommonJS和ES Module都是JS模块化的一种表现形式&a…

TS + Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum

TS Vue3 elementUI 表格列表中如何方便的标识不同类型的内容&#xff0c;颜色区分 enum 本文内容为 TypeScript 一、基础知识 在展示列表的时候&#xff0c;列表中的某个数据可能是一个类别&#xff0c;比如&#xff1a; enum EnumOrderStatus{"未受理" 1,"…

SQL执行原理

文章目录 SQL执行原理慢SQL分析优化案例优化步骤&#xff1a; 分库分表实施分库分表时&#xff0c;如何保证数据一致性&#xff1f;实践案例案例实施垂直拆分的步骤&#xff1a; SQL执行原理 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理与查询关系数…

【LeetCode-74.搜索二维矩阵】

题目详情&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&am…

Csharp学习Linq

Linq的学习 这里继续使用之前文章创建的学生类&#xff0c;首先简单介绍一下linq的使用。 Student.cs public class Student{public int Id { get; set; }public int ClassId { get; set; }public string Name { get; set; }public int Age { get; set; }public string Descr…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

Kubernetes自动化配置部署

在新建工程中&#xff0c;使用k8s的devops服务&#xff0c;自动化部署项目 1、在搭建好k8s的集群中&#xff0c;确认已开启devops服务&#xff1b; 2、新建Maven项目之后&#xff0c;创建dockerfile、deploy和Jenkins文件 例如&#xff1a; Dockerfile FROM bairong.k8s.m…

【思维】第十四届蓝桥杯省赛C++ C组/研究生组 Python A组/C组《翻转》(C++)

【题目描述】 小蓝用黑白棋的 n 个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为 n 的 01 串 T&#xff0c;他发现如果把黑棋当做 1&#xff0c;白棋当做 0&#xff0c;这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定&#xff0c;如果在 S 中发现一个棋子和它…

突破编程_C++_面试(STL 编程 stack)

1 请简述 std::stack 在 C STL 中的基本功能和使用场景 std::stack在C STL&#xff08;标准模板库&#xff09;中是一个容器适配器&#xff0c;专门用于实现后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;的数据结构。其基本功能和使用场景如下&#xff…

【WPF应用9】 基本控件-Grid的对其和属性详细说明及示例

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Grid是一种强大的布局控件&#xff0c;它可以用来对齐和排列容器中的子元素。Grid控件允许您以行列的形式组织UI元素&#xff0c;并且可以指定行列的数量、大小和布局方式。在本文中&#xff0c;我…

C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序

1 图的广度优先遍历 图的广度优先遍历(或搜索)类似于树的广度优先遍历(参见本文的方法2)。这里唯一需要注意的是,与树不同,图可能包含循环,因此我们可能再次来到同一个节点。为了避免多次处理节点,我们使用布尔访问数组。为简单起见,假设所有顶点都可以从起始顶点到达…

ideaSSM 学员信息管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 学员信息管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

C语言基础知识复习(考研)

&#xff08;1&#xff09;C语言文件操作 1 什么是文件 文件有不同的类型&#xff0c;在程序设计中&#xff0c;主要用到两种文件&#xff1a; (1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行这种文件的内容是程序代码。 (2)数据文件。文件的内容不是…

软件测试相关内容第五弹 -- 自动化测试Selenium

写在前&#xff1a;hello这里是西西~ 这边博客主要学习关于自动化测试的相关内容&#xff0c;首先了解自动化测试的相关理论知识&#xff0c;其次学习web应用中基于UI的自动化测试框架 - selemium[需要重点掌握selenium工作原理]&#xff0c;实操selenium,最后学习Junit相关知识…

当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API&#xff0c; 并将其转换为兼容OpenAI的API 一直没能搞定OpenAI的订阅&#xff0c; 就因为没有搞定国外的信用卡&#xff0c; 所以就一直使用GPT-3.5来处理日常的文字生成工作&#xff0c; 例如写文档&#xff0c; 生成一些简单的脚…

AI助力生产制造质检,基于轻量级YOLOv8n模型开发构建工业生产制造场景下的瓷砖瑕疵检测识别分析系统

瓷砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光&#xff0c;最后进行质量检测和包装。得益于产业自动化的发展&#xff0c;目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说&#xff0c;一条产线需要配数名质检工&…

论文阅读-MIPD:一种用于分布式深度神经网络训练的自适应梯度稀疏化框架

摘要—基于参数服务器架构的异步训练广泛应用于大规模数据集和深度神经网络模型的扩展训练。在大规模分布式深度学习系统中&#xff0c;通信一直被认为是主要瓶颈。最近的研究尝试通过梯度稀疏化和量化方法来减少通信流量。我们发现前期研究存在三个限制。首先&#xff0c;他们…