首页 > 其他分享 >spring statemachine

spring statemachine

时间:2024-07-07 22:09:09浏览次数:17  
标签:flatMap 调用 statemachine triggerSink spring TriggerQueueItem handleTrigger 方法

进行状态转化的逻辑:

org.springframework.statemachine.support.ReactiveStateMachineExecutor#queueEvent

Flux<Message<E>> messages = Flux.merge(message, Flux.fromIterable(deferList));

		MonoSinkStateMachineExecutorCallback triggerCallback = new MonoSinkStateMachineExecutorCallback();
		Mono<Void> triggerCallbackSink = Mono.create(triggerCallback);

		return messages
			.flatMap(m -> handleEvent(m, callback, triggerCallback))
			.flatMap(tqi -> Mono.fromRunnable(() -> {
					triggerSink.emitNext(tqi, EmitFailureHandler.FAIL_FAST);
				})
				.retryWhen(Retry.fixedDelay(10, Duration.ofMillis(10))))
			.then()
			.and(triggerCallbackSink);

在 ReactiveStateMachineExecutor 类中,triggerSink 是一个 Sinks.Many<TriggerQueueItem> 类型的对象,用于管理状态机触发器的事件流。当调用 triggerSink.emitNext 方法时,它会向这个事件流中发送一个 TriggerQueueItem 对象。这个操作本质上是在发布一个事件,表示有一个新的触发器项需要被处理。

handleTrigger 方法是设计来处理这些触发器项的。它通过订阅 triggerSink 的事件流来实现这一点。
在 ReactiveStateMachineExecutor 类的 onInit 方法中,你会看到如下代码:

triggerSink = Sinks.many().multicast().onBackpressureBuffer(Queues.SMALL_BUFFER_SIZE, false);
triggerFlux = triggerSink.asFlux().flatMap(trigger -> handleTrigger(trigger), 1);

这段代码首先初始化 triggerSink,然后创建一个 Flux(名为 triggerFlux),这个 Flux 通过调用 flatMap 方法来处理 triggerSink 中的每个 TriggerQueueItem。flatMap 方法的参数是 handleTrigger 方法的引用,这意味着每当 triggerSink 发出一个新的 TriggerQueueItem 时,handleTrigger 方法都会被调用来处理这个项。
因此,当你调用 triggerSink.emitNext 发送一个 TriggerQueueItem 时,这个项会被添加到 triggerSink 的事件流中,然后 handleTrigger 方法会被自动调用来处理这个项,因为它已经订阅了这个事件流并设置为处理流中的每个项。

handleTrigger方法负责实际的状态转换逻辑,包括决定是否进行状态转换以及如何进行状态转换。

  • 处理事件(handleEvent): 这个方法接收一个事件,并根据当前状态和事件类型决定是否需要进行状态转换。如果需要,它会生成一个表示该转换的TriggerQueueItem对象。
  • 处理触发器(handleTrigger): 当TriggerQueueItem被triggerSink.emitNext方法发出后,它会被handleTrigger方法处理。这个方法检查触发器和当前状态,然后执行相应的状态转换逻辑。这可能包括调用StateMachineExecutorTransit的transit方法,该方法实现了具体的状态转换逻辑。

handleTrigger() 调用 handleTriggerTrans(), 调用org.springframework.statemachine.support.StateMachineExecutor.StateMachineExecutorTransit#transit , 执行相应的状态转换逻辑。

标签:flatMap,调用,statemachine,triggerSink,spring,TriggerQueueItem,handleTrigger,方法
From: https://www.cnblogs.com/xushengbin/p/18289002

相关文章

  • 基于SpringBoot+Vue+uniapp的随心淘网管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的劳务外包管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Spring security
    目录 引入依赖 登录验证流程原理分析 SpringSecurity完整流程 !!!我们主要改的就是userDetailService实现类的里面的逻辑,把它改成到数据库查询前后端分离的实现思路思路流程登录 第一步:实现userdetailservice配置security实现密码加密存储登录接口校验 退出登......
  • SpringSecurity简单自定义配置
    初学者对于学习SpringSecurity相关的一些简单自定义配置总结。由于自身能力并不能和大佬相比较,以下的一些内容有误或有可改进地方,希望指出,我抱有一颗谦虚好学的心保持热情,并感谢指正。实现案例:1.基于内存的用户认证2.基于数据库的用户认证3.添加用户(数据库)4.自定义密......
  • SpringBoot3 整合 Logback
    SpringBoot3整合Logback日志框架1.默认框架实现SpringBoot3默认是使用SLF4J+Logback作为默认的日志门面和实现,但也支持其他日志系统,如Log4j2、JUL(JavaUtilLogging),这是通过所谓的日志门面实现的,开发者可以根据自己的需求选择合适的日志实现框架进行配置。日志......
  • 【Spring Boot】基于 JPA 开发的文章管理系统(CRUD)
    《JPA从入门到精通》系列包含以下文章:Java持久层API:JPA认识JPA的接口JPA的查询方式基于JPA开发的文章管理系统(CRUD)关系映射开发(一):一对一映射关系映射开发(二):一对多映射关系映射开发(三):多对多映射基于JPA开发的文章管理系统(CRUD)1.实现文章实体2.实现......
  • 【spring】(极简版)
    spring的核心就是控制反转和依赖注入,说人话就是把对象交给spring容器管理搭建一个spring非常简单项目结构(简单吧)第一步,创建一个空的Maven项目并在pom.xml中导入依赖(其实spring的依赖只用spring-context就可以了,不过我习惯用单元测试,所有导了个junit的包,如果不导junit,用mai......
  • 【Spring Boot】关系映射开发(三):多对多映射
    关系映射开发(三):多对多映射1.创建实体1.1创建Student实体1.2创建Teacher实体2.创建测试在多对多关联关系中,只能通过中间表的方式进行映射,不能通过增加外键来实现。注解@ManyToMany用于关系的发出端和接收端。关系的发出端定义一个集合类型的接......
  • SpringBoot-校园疫情防控系统-93033(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    springboot校园疫情防控系统摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对校园疫情防控等问题,对校园疫情防控进行研究分析,然后开发设计出......
  • Spring框架:核心概念与Spring Boot微服务开发指南
    引言        Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,用于开发Java应用程序。Spring的核心概念包括依赖注入(DI)、面向切面编程(AOP)和事务管理。随着微服务架构的兴起,SpringBoot作为Spring框架的扩展,提供了一种快速开发独立微服务的方式。本文将详细......