Recipes

本章包含现有内置状态的文档 机器配方。spring-doc.cadn.net.cn

Spring Statemachine 是一个基础框架。也就是说,它几乎没有什么 更高级的功能或超出 Spring Framework 的多种依赖。 因此,正确使用状态机可能很困难。为了帮助, 我们创建了一套针对常见使用场景的配方模块。spring-doc.cadn.net.cn

到底什么是Recipes?状态机配方是一个用于处理公共信息的模块 用例。本质上,状态机配方既是我们尝试的一个例子 让你更容易重复使用和扩展。spring-doc.cadn.net.cn

Recipes是为Spring做出外部贡献的好方法 状态机项目。如果你还没准备好为 Framework Core 本身,一个自定义且通用的配方,是个很好的方法 与其他用户共享功能。

36. 坚持

持久化配方是一个简单的工具,允许你使用单一状态 机器实例中任意项的状态被持久化并更新。 一个仓库。spring-doc.cadn.net.cn

该配方的主要类别是PersistStateMachineHandler,这提供了三个假设:spring-doc.cadn.net.cn

  • 一个实例StateMachine<String, String>需要使用 其中PersistStateMachineHandler.注意,状态和事件是必需的 为类型字符串.spring-doc.cadn.net.cn

  • PersistStateChangeListener需要在Handler注册 对持久请求做出反应。spring-doc.cadn.net.cn

  • handleEventWithState方法用于调控状态变化。spring-doc.cadn.net.cn

你可以在Persist上找到一个演示如何使用这个配方的示例。spring-doc.cadn.net.cn

37. 任务

任务 recipe 是一个运行 DAG(有向无环图)的概念可跑使用 一台状态机。这个配方是基于提出的理念发展而来的 在任务样本中。spring-doc.cadn.net.cn

下一张图片展示了状态机的通用概念。在这张状态图中, 下面所有东西任务展示了单一的通用概念 任务得以执行。因为这个配方可以让你注册深层 任务的层级DAG(即实态图将是一个深度的 嵌套的子国家和区域集合),我们无需 更精准。spring-doc.cadn.net.cn

例如,如果你只有两个注册任务,以下状态图表 当TASK_id被替换为TASK_1TASK_2(假设 注册任务的ID为12).spring-doc.cadn.net.cn

州图9

执行可跑可能会出现错误。尤其是如果是情结 涉及任务的DAG,你需要有一种处理方式 任务执行错误,然后有办法继续执行 而不是执行已经成功执行的任务。也 如果能处理一些执行错误就更好了 自然而然。作为最后的备选方案,如果错误无法处理 自动地,状态机会被置于用户能够处理的状态 手动错误。spring-doc.cadn.net.cn

任务处理器包含一个构建器方法来配置处理实例 并遵循简单的建造模式。你可以用这个构建器来 注册可跑任务和任务监听器实例并定义StateMachinePersist钩。spring-doc.cadn.net.cn

现在我们可以简单地说可跑运行简单睡眠如下 示例如下:spring-doc.cadn.net.cn

private Runnable sleepRunnable() {
	return new Runnable() {

		@Override
		public void run() {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
			}
		}
	};
}
上述例子是本章所有示例的基础。

执行多个sleepRunnable(睡眠可运行)任务,你可以注册任务和 执行runTasks()方法任务处理器,如下示例所示:spring-doc.cadn.net.cn

TasksHandler handler = TasksHandler.builder()
		.task("1", sleepRunnable())
		.task("2", sleepRunnable())
		.task("3", sleepRunnable())
		.build();

handler.runTasks();

为了监听任务执行的情况,你可以注册一个实例 一个任务监听器其中任务处理器.这个Recipes 提供适配器TasksListenerAdapter如果你不想 实现完整的接口。听者会提供各种钩子 倾听任务执行事件。以下示例展示了我的任务监听器类:spring-doc.cadn.net.cn

private class MyTasksListener extends TasksListenerAdapter {

	@Override
	public void onTasksStarted() {
	}

	@Override
	public void onTasksContinue() {
	}

	@Override
	public void onTaskPreExecute(Object id) {
	}

	@Override
	public void onTaskPostExecute(Object id) {
	}

	@Override
	public void onTaskFailed(Object id, Exception exception) {
	}

	@Override
	public void onTaskSuccess(Object id) {
	}

	@Override
	public void onTasksSuccess() {
	}

	@Override
	public void onTasksError() {
	}

	@Override
	public void onTasksAutomaticFix(TasksHandler handler, StateContext<String, String> context) {
	}
}

你可以选择使用建材工具注册听众,或者直接通过任务处理器如下示例所示:spring-doc.cadn.net.cn

MyTasksListener listener1 = new MyTasksListener();
MyTasksListener listener2 = new MyTasksListener();

TasksHandler handler = TasksHandler.builder()
		.task("1", sleepRunnable())
		.task("2", sleepRunnable())
		.task("3", sleepRunnable())
		.listener(listener1)
		.build();

handler.addTasksListener(listener2);
handler.removeTasksListener(listener2);

handler.runTasks();

每一项任务 需要有唯一标识符,且(可选地)任务可以是 定义为子任务。实际上,这形成了一个任务的DAG。 以下示例展示了如何创建深度嵌套的任务DAG:spring-doc.cadn.net.cn

TasksHandler handler = TasksHandler.builder()
		.task("1", sleepRunnable())
		.task("1", "12", sleepRunnable())
		.task("1", "13", sleepRunnable())
		.task("2", sleepRunnable())
		.task("2", "22", sleepRunnable())
		.task("2", "23", sleepRunnable())
		.task("3", sleepRunnable())
		.task("3", "32", sleepRunnable())
		.task("3", "33", sleepRunnable())
		.build();

handler.runTasks();

当发生错误,运行这些任务的状态机进入错误州政府,你可以打电话修正当前问题handler 方法 重置保持在状态机扩展状态中的任务当前状态 变量。然后你可以使用继续错误handler 方法 指示状态机从错误状态返回准备状态,你又可以运行任务。 以下示例展示了如何实现:spring-doc.cadn.net.cn

TasksHandler handler = TasksHandler.builder()
		.task("1", sleepRunnable())
		.task("2", sleepRunnable())
		.task("3", sleepRunnable())
		.build();

		handler.runTasks();
		handler.fixCurrentProblems();
		handler.continueFromError();