当前位置: 首页 > news >正文

Spring Boot与Axon Framework整合教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


简介

Axon Framework是一个用于构建CQRS(命令查询职责分离)和事件溯源(Event Sourcing)应用的框架,而Spring Boot提供了快速开发能力。二者结合可高效实现高扩展性、可维护的分布式系统。


环境准备

  • JDK 17+
  • Spring Boot 3.2+
  • Axon Framework 4.9+
  • Maven/Gradle

步骤详解

1. 创建Spring Boot项目

使用start.spring.io生成基础项目,选择:

  • Spring Web
  • Lombok(可选)

2. 添加Axon依赖

<!-- pom.xml -->
<dependency><groupId>org.axonframework</groupId><artifactId>axon-spring-boot-starter</artifactId><version>4.9.0</version>
</dependency>

3. 配置Axon(可选)

# application.yml
axon:serializer:general: jacksoneventhandling:processors:default: tracking

示例:银行账户管理

1. 定义命令(Command)

// 开户命令
public record CreateAccountCommand(String accountId, int initialBalance) {}// 存款命令
public record DepositMoneyCommand(String accountId, int amount) {}// 取款命令
public record WithdrawMoneyCommand(String accountId, int amount) {}

2. 定义事件(Event)

// 账户创建事件
public record AccountCreatedEvent(String accountId, int initialBalance) {}// 存款事件
public record MoneyDepositedEvent(String accountId, int amount) {}// 取款事件
public record MoneyWithdrawnEvent(String accountId, int amount) {}

3. 创建聚合根(Aggregate)

@Aggregate
@Getter
@NoArgsConstructor
public class BankAccountAggregate {@AggregateIdentifierprivate String accountId;private int balance;@CommandHandlerpublic BankAccountAggregate(CreateAccountCommand command) {apply(new AccountCreatedEvent(command.accountId(), command.initialBalance()));}@CommandHandlerpublic void handle(DepositMoneyCommand command) {apply(new MoneyDepositedEvent(command.accountId(), command.amount()));}@CommandHandlerpublic void handle(WithdrawMoneyCommand command) {if (balance < command.amount()) {throw new InsufficientBalanceException();}apply(new MoneyWithdrawnEvent(command.accountId(), command.amount()));}@EventSourcingHandlerpublic void on(AccountCreatedEvent event) {this.accountId = event.accountId();this.balance = event.initialBalance();}@EventSourcingHandlerpublic void on(MoneyDepositedEvent event) {balance += event.amount();}@EventSourcingHandlerpublic void on(MoneyWithdrawnEvent event) {balance -= event.amount();}
}

4. 创建Query处理

@Service
public class AccountQueryService {private final Map<String, Integer> accounts = new ConcurrentHashMap<>();@EventHandlerpublic void on(AccountCreatedEvent event) {accounts.put(event.accountId(), event.initialBalance());}@EventHandlerpublic void on(MoneyDepositedEvent event) {accounts.computeIfPresent(event.accountId(), (k, v) -> v + event.amount());}@EventHandlerpublic void on(MoneyWithdrawnEvent event) {accounts.computeIfPresent(event.accountId(), (k, v) -> v - event.amount());}@QueryHandlerpublic Integer handle(GetBalanceQuery query) {return accounts.get(query.accountId());}
}

5. 创建REST接口

@RestController
@RequestMapping("/accounts")
@RequiredArgsConstructor
public class AccountController {private final CommandGateway commandGateway;private final QueryGateway queryGateway;@PostMappingpublic CompletableFuture<String> createAccount(@RequestBody CreateAccountRequest request) {return commandGateway.send(new CreateAccountCommand(UUID.randomUUID().toString(),request.initialBalance()));}@GetMapping("/{accountId}/balance")public CompletableFuture<Integer> getBalance(@PathVariable String accountId) {return queryGateway.query(new GetBalanceQuery(accountId), Integer.class);}
}

运行与测试

  1. 启动Spring Boot应用
  2. 使用curl测试:
# 创建账户
curl -X POST -H "Content-Type: application/json" -d '{"initialBalance":1000}' http://localhost:8080/accounts# 查询余额(替换{accountId})
curl http://localhost:8080/accounts/{accountId}/balance

关键配置说明

  1. 序列化配置:建议使用Jackson进行JSON序列化
  2. 事件存储:默认使用内存存储,生产环境可配置JPA或JDBC
  3. 分布式处理:通过axon-distributed-command-bus实现命令总线扩展

扩展方向

  1. 添加JPA事件存储
  2. 集成Spring Security进行权限控制
  3. 配置Saga实现复杂事务
  4. 使用Axon Server进行集群管理

通过本教程,您已完成了一个基础的CQRS/ES系统实现。建议通过Axon Dashboard监控事件流,并逐步添加更复杂的业务逻辑。

相关文章:

Spring Boot与Axon Framework整合教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 Axon Framework是一个用于构建CQRS&#xff08;命令查询职责分离&#xff09;和事件溯源&#xff08;Event Sourcing&#xff09;应用的框架&#xff0…...

从技术角度看大语言模型进化技术路线与落地应用详解:未来的最佳实践方向是什么?

文章大纲 **一、模型架构创新:从Transformer到下一代架构****二、训练与优化技术:从暴力Scaling到精细调控****三、数据与知识工程:从粗放喂养到智能增强****四、应用层进化:从通用能力到垂直场景突破****五、伦理与可持续性技术**未来技术路线图参考文献**一、大模型架构创…...

LSM-Tree (日志结构合并树)

LSM-Tree&#xff08;日志结构合并树&#xff09;是一种高效处理写操作的存储结构&#xff0c;广泛应用于NoSQL数据库如LevelDB和RocksDB。其核心思想是将随机写入转换为顺序写入&#xff0c;提升吞吐量。以下是其原理及Java实现示例&#xff1a; ### **LSM-Tree 原理** 1. **…...

自动驾驶---不依赖地图的大模型轨迹预测

1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵,且跨区域泛化能力受限。动态场景局限性:地图无法实时反映临时障碍物或施…...

记录一次mysql全文索引不生效

先是创建全文索引&#xff1a; alter table sms_img_library add fulltext index sms_img_library_title_idx(title) 但是执行下面sql&#xff0c;没有数据出来 select * from sms_img_library where match (title) against(壮丽);排查了最小分词&#xff0c;设置为2 SHOW…...

蓝桥杯题型

蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球&#xff08;日期问题&#xff09;时间显示&#xff08;时间问题&#xff09;跑步计划&#xff08;日期问题&#xff09;偶串(字符&#xff09;最长子序列&#xff08;字符&#xff09;字母数&#xff08;进制转换&#xff09;6个0&…...

用Python分割并高效处理PDF大文件

在处理大型PDF文件时&#xff0c;将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区&#xff0c;它可以提高处理效率&#xff0c;并使分析或操作文档变得更容易。在本文中&#xff0c;我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...

DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元

背景 在全球人工智能技术高速迭代的背景下&#xff0c;算力成本高企、异构资源适配复杂、模型部署效率低下等问题&#xff0c;始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点&#xff0c;而博云先进算力管理平台AIOS的全面适配&#xff0c;则为这一技术…...

顶点着色器和片段着色器

在Unity渲染中&#xff0c;**顶点着色器&#xff08;Vertex Shader&#xff09;和片段着色器&#xff08;Fragment Shader&#xff09;**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工&#xff1a;想象你要画一幅由三角形组成的3D模型&#xff0c;顶点…...

Uniapp打包H5端弱网络环境下存在页面UI渲染错乱问题方案实现

一.需求 uniapp打包的H5项目&#xff0c;首页模块的业务逻辑偏多&#xff0c;调用的接口数量庞大&#xff0c;在弱网络的情况下切换了页面或者网络较好但是页面的UI未渲染完成的情况下快速地切换了页面会出现UI渲染错乱的问题&#xff0c;针对该问题个人从两个方面来进行处理&…...

Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)

Dify部署参考&#xff1a;Dify Rag部署并集成在线Deepseek教程&#xff08;Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装&#xff09; DifyDeepSeek - Excel数据一键可视化&#xff08;创建步骤案例&#xff09;-DSL工程文件&#xff08;可直接导入&#x…...

## DeepSeek写水果记忆配对手机小游戏

DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…...

Windows系统编程(八)线程同步

线程安全问题 每个线程都有自己独立的堆栈&#xff0c;局部变量是存储在栈中的&#xff0c;这就意味着每个线程都会有一份自己的局部变量&#xff0c;当线程仅仅访问自己的局部变量时就不存在线程安全问题。但是全局变量是存储在全局区的&#xff0c;多线程共享全局变量&#…...

create_react_agent 函数,根据创建的 chat 模型实例和工具列表 tools 构造一个“反应式代理”(react agent)

graph create_react_agent(chat, tools)1. create_react_agent 函数的作用 create_react_agent 是一个工厂函数&#xff0c;它接收两个参数&#xff1a; chat 模型实例&#xff08;这里是 ChatOpenAI 的对象&#xff09;&#xff1a;它负责生成语言模型的回复&#xff0c;也…...

Unity ECS与MonoBehaviour混合架构开发实践指南

一、混合架构设计背景 1. 技术定位差异 ECS&#xff08;Entity Component System&#xff09;&#xff1a;面向数据设计&#xff08;DOD&#xff09;&#xff0c;适用于大规模实体计算&#xff08;如10万单位战斗&#xff09; MonoBehaviour&#xff1a;面向对象设计&#x…...

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限&#xff0c;厂商并没有实现完整的OpenGL特性&#xff0c;而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台&#xff0c;最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…...

「DataX」数据迁移-IDEA运行DataX方法总结

背景 业务需求希望把Oracle数据库中的数据&#xff0c;迁移至MySql数据库中&#xff0c;因为需要迁移全量和增量的数据&#xff0c;所以希望想用数据迁移工具进行操作。 经过一些调研查询&#xff0c;最终打算使用DataX进行数据的迁移。 DataX简单介绍 DataX 是阿里云 DataW…...

python从入门到精通(二十六):python文件操作之Word全攻略(基于python-docx)

python文件操作之word技巧大全 word技巧基础到高级操作大全A.准备工作1. 安装python-docx库2. 导入库 B.基础操作1. 创建Word文档1.1 创建文档对象1.2 添加word标题1.3 添加word段落1.4 设置段落样式1.5 创建有序列表1.6 创建无序列表1.7添加word分页1.8 添加word图片1.9 添加w…...

STM32 ST-LINK Utility 切换 NRST_MODE 后下载失败问题

在使用 STM32 ST-LINK Utility 烧录时&#xff0c;有需要改变芯片选择复位的时候需要修改 Option Bytes 中的 NRST_MODE 选项&#xff0c;可能会遇见 “Programming error 0x8000200!” 的错误&#xff0c;后面不管是取消读写加密还是复位都不能下载&#xff0c;包括再用 keil …...

【算法】010、合并两个有序链表

【算法】010、合并两个有序链表 文章目录 一、合并两个有序链表1.1 思路1.2 多语言解法 一、合并两个有序链表 1.1 思路 // go package mainimport ("fmt""strconv" )type ListNode struct {Val intNext *ListNode }func (n *ListNode) String() (ans s…...

FreeRTOS任务状态查询

一.任务相关API vTaskList&#xff08;&#xff09;&#xff0c;创建一个表格描述每个任务的详细信息 char biaoge[1000]; //定义一个缓存 vTaskList(biaoge); //将表格存到这缓存中 printf("%s /r/n",biaoge); 1.uxTaskPriorityGet&#xff08;&#xf…...

Django小白级开发入门

1、Django概述 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。 Django 框架的核心组件有&#xff1a; 用于创建模型的对象关系映射为最终用户设计较好的管理界面URL 设计设计者友好的模板…...

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…...

通用信息抽取大模型PP-UIE开源发布,强化零样本学习与长文本抽取能力,全面适配多场景任务

背景与简介 信息抽取&#xff08;information extraction&#xff09;是指&#xff0c;从非结构化或半结构化数据&#xff08;如自然语言文本&#xff09;中自动识别、提取并组织出结构化信息。通常包含多个子任务&#xff0c;例如&#xff1a;命名实体识别&#xff08;NER&am…...

【玩转正则表达式】将正则表达式中的分组(group)与替换进行结合使用

在文本处理和数据分析领域&#xff0c;正则表达式&#xff08;Regular Expressions&#xff0c;简称regex&#xff09;是一种功能强大的工具。它不仅能够帮助我们匹配和搜索字符串中的特定模式&#xff0c;还能通过分组&#xff08;Grouping&#xff09;和替换&#xff08;Subs…...

Kotlin和Java区别

哈哈哈&#xff0c;前段时间&#xff0c;面试的时候&#xff0c;突然问到我Kotlin和Java的区别&#xff0c;一下子把我问懵逼了&#xff0c;确实没遇到问这个的&#xff0c;想了下&#xff0c;说了下Kotlin的编译时空检查机制&#xff0c;代码更简洁&#xff0c;很多封装好的AP…...

大语言模型进化论:从达尔文到AI的启示与展望

文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…...

Django系列教程(5)——Django模型详解

目录 模型定义小案例 模型的组成 模型的字段 基础字段 关系字段 on_delete删除选项 related_name选项 模型的META选项 模型的方法 标准方法 示例一&#xff1a;自定义方法 示例二&#xff1a;自定义Manager方法 完美的高级Django模型示例 小结 Model (模型) 简而…...

2008-2024年中国手机基站数据/中国移动通信基站数据

2008-2024年中国手机基站数据/中国移动通信基站数据 1、时间&#xff1a;2008-2024年 2、来源&#xff1a;OpenCelliD 3、指标&#xff1a;网络类型、网络代数、移动国家/地区、移动网络代码、区域代码、小区标识、单元标识、坐标经度、坐标纬度、覆盖范围、测量样本数、坐标…...

Java在word中动态增加表格行并写入数据

SpringBoot项目中在word中动态增加表格行并写入数据,不废话,直接上配置和代码: 模板内容如下图所示: 模板是一个空word表格即可,模板放在resources下的自定义目录下,如下图示例。 实体类定义如下: @Data @AllArgsConstructor @NoArgsConstructor public class Person …...

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;二&#xff09;&#xff1a;创建项目、编译、预览、发布&#xff08;250308&#xff09;一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…...

JavaScript基础-比较运算符

在JavaScript编程中&#xff0c;比较运算符用于比较两个值&#xff0c;并返回一个布尔值&#xff08;true或false&#xff09;&#xff0c;这对于我们进行条件判断和逻辑控制至关重要。掌握这些运算符不仅有助于编写高效的代码&#xff0c;也是处理复杂逻辑的基础。本文将详细介…...

2025 docker安装TiDB数据库

1.确保安装了docker和docker-compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod x /usr/local/bin/docker-compose2.编写 Docker Compose 文…...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

【定制开发】碰一碰发视频系统定制开发,支持OEM

在短视频营销爆发的2025年&#xff0c;"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发&#xff0c;单月视频发布量突破10万条&#xff0c;获客成本降低80%&#xff01;本文将深入解析该系统的技术架构与开发要点&#xff0c;助你快速搭建高…...

模型的原始输出为什么叫 logits

模型的原始输出为什么叫 logits flyfish 一、Logarithm&#xff08;对数 log&#xff09; 定义&#xff1a;对数是指数运算的逆运算&#xff0c;表示某个数在某个底数下的指数。 公式&#xff1a;若 b x a b^x a bxa&#xff0c;则 log ⁡ b ( a ) x \log_b(a) x logb…...

YOLOv8改进SPFF-LSKA大核可分离核注意力机制

YOLOv8改进------------SPFF-LSKA 1、LSAK.py代码2、添加YAML文件yolov8_SPPF_LSKA.yaml3、添加SPPF_LSKA代码4、ultralytics/nn/modules/__init__.py注册模块5、ultralytics/nn/tasks.py注册模块6、导入yaml文件训练 1、LSAK.py代码 论文 代码 LSKA.py添加到ultralytics/nn/…...

Unity, AssetBundle的一些“隐藏”方法

​ 只分享实战,理论不多说了,网上都烂大街了 在Project View可以通## 标题过输入“b:” 找到所有带assetbundleName的物件 ​​ AssetBundle打包前的查找和管理方法 若需要获取 每个AssetBundle名称对应的所有具体资源文件路径(类似AssetBundle Browser工具的功能),可以…...

分布式存储学习——HBase概述

1.1 HBase概述 1.1.1 理解大数据背景 1.1.2 HBase是什么 1.1.3 HBase与Hadoop的关系 1.1.4 HBase的核心功能模块 1.1.5 HBase的应用场景和经典案例 1.1.6 小结 本文参考于学校《HBase应用于开发》教材 1.1 HBase概述 本节将介绍大数据背景和HBase的基本概念&#xff0c…...

Mysql表的复合查询

1.基本查询 使用scott案列 ----来源csdn&#xff1a; Mysql下-scott用户表的创建_风泊月mysql 员工表-CSDN博客 案列1&#xff1a;查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大小的J 查询雇员&#xff0c;从emp表中查询&#xff0c;s…...

RAG技术的PDF智能问答系统

关键要点 系统基于RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;允许用户上传PDF并进行智能问答。 使用Ollama的deepseek-r1模型和FAISS向量数据库&#xff0c;支持普通对话和基于PDF的问答模式。 提供简洁的Web界面&#xff0c;支持文件拖拽上传和多轮对话。 研…...

【Java基础-52】Java中URL类的openConnection()方法:原理与应用场景

在Java编程中&#xff0c;java.net.URL类是一个非常重要的类&#xff0c;用于表示统一资源定位符&#xff08;URL&#xff09;。通过URL类&#xff0c;我们可以方便地访问网络资源。其中&#xff0c;openConnection()方法是URL类中一个非常强大的方法&#xff0c;它允许我们与U…...

android为第三方提供部分系统接口

文章目录 Settings - 亮灭屏Settings - 恢复出厂设置Settings - 数字锁屏/解锁Settings - 设置系统时间PackageInstaller - 安装/卸载第三方应用摘要:本文对系统模块进行改造,提供广播等形式的接口对外提供无法直接调用的系统级别接口,实现部分功能的集合。如果是广播形式,…...

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…...

钣金加工行业数字化转型MES方案

一、 行业痛点&#xff1a;钣金加工行业普遍面临以下挑战&#xff1a; 订单多样化、小批量、定制化需求增多&#xff1a;传统生产模式难以适应快速变化的市场需求。 生产流程复杂、工序繁多&#xff1a;涉及切割、折弯、焊接、表面处理等多个环节&#xff0c;协同效率低。 生产…...

算法-回溯算法总结

回溯与递归的区别 回溯的本质是穷举&#xff0c;回溯一定代表有递归 递归就一直往深处递归就好了&#xff0c;但是回溯还伴随着递归结束之后的”回溯操作“&#xff0c;例如递归中处理的1&#xff0c;在回溯中要-1。 回溯的算法思路 一般都是返回void,参数不能一下子全部想定…...

ORACLE 执行查询语句慢(不走对应索引)

1. 索引未被创建或未正确创建 确保为查询中涉及的列创建了索引。例如&#xff0c;如果你经常需要按column_name列进行查询&#xff0c;确保已经为该列创建了索引,索引创建语句 CREATE INDEX idx_column_name ON table_name(column_name); 2、索引不可用 原因:索引可能被标记为不…...

零售交易流程相关知识(top-down拆解)

引入 关于POS机交易时的后台数据交互 模块之间数据交换&#xff0c;都可以能被窃取或篡改。由此引入加密、解密机制和签名、验签机制 经典的加密、解密机制&#xff1a; 对称加密&#xff1a;DES\ TDES\ AES\ RC4 非对称加密&#xff1a;RSA\ DSA\ ECC 经典的签名、验签…...

在人工智能软件的帮助下学习编程实例

1 引言 本文记录在人工智能软件的帮助下学习一种全新的编程环境的实例&#xff0c;之所以提人工智能软件而不是单指DeepSeek&#xff0c;一方面DeepSeek太火了&#xff0c;经常服务器繁忙&#xff0c;用本机本地部署的最多运行70b模型&#xff0c;又似乎稍差。另一方面也作为一…...

C语言_数据结构总结5:顺序栈

纯C语言代码&#xff0c;不涉及C 想了解链式栈的实现&#xff0c;欢迎查看这篇文章&#xff1a;C语言_数据结构总结6&#xff1a;链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯&#xff1a; 1. 就是遇到代码哪里不理解的&#xff0c;你就问豆包&#xff0c;C知道&a…...