Recipes
本章包含现有内置状态的文档 机器配方。
Spring Statemachine 是一个基础框架。也就是说,它几乎没有什么 更高级的功能或超出 Spring Framework 的多种依赖。 因此,正确使用状态机可能很困难。为了帮助, 我们创建了一套针对常见使用场景的配方模块。
到底什么是Recipes?状态机配方是一个用于处理公共信息的模块 用例。本质上,状态机配方既是我们尝试的一个例子 让你更容易重复使用和扩展。
| Recipes是为Spring做出外部贡献的好方法 状态机项目。如果你还没准备好为 Framework Core 本身,一个自定义且通用的配方,是个很好的方法 与其他用户共享功能。 |
36. 坚持
持久化配方是一个简单的工具,允许你使用单一状态 机器实例中任意项的状态被持久化并更新。 一个仓库。
该配方的主要类别是PersistStateMachineHandler,这提供了三个假设:
-
一个实例
StateMachine<String, String>需要使用 其中PersistStateMachineHandler.注意,状态和事件是必需的 为类型字符串. -
PersistStateChangeListener需要在Handler注册 对持久请求做出反应。 -
这
handleEventWithState方法用于调控状态变化。
你可以在Persist上找到一个演示如何使用这个配方的示例。
37. 任务
任务 recipe 是一个运行 DAG(有向无环图)的概念可跑使用
一台状态机。这个配方是基于提出的理念发展而来的
在任务样本中。
下一张图片展示了状态机的通用概念。在这张状态图中,
下面所有东西任务展示了单一的通用概念
任务得以执行。因为这个配方可以让你注册深层
任务的层级DAG(即实态图将是一个深度的
嵌套的子国家和区域集合),我们无需
更精准。
例如,如果你只有两个注册任务,以下状态图表
当TASK_id被替换为TASK_1和TASK_2(假设
注册任务的ID为1和2).
执行可跑可能会出现错误。尤其是如果是情结
涉及任务的DAG,你需要有一种处理方式
任务执行错误,然后有办法继续执行
而不是执行已经成功执行的任务。也
如果能处理一些执行错误就更好了
自然而然。作为最后的备选方案,如果错误无法处理
自动地,状态机会被置于用户能够处理的状态
手动错误。
任务处理器包含一个构建器方法来配置处理实例
并遵循简单的建造模式。你可以用这个构建器来
注册可跑任务和任务监听器实例并定义StateMachinePersist钩。
现在我们可以简单地说可跑运行简单睡眠如下
示例如下:
private Runnable sleepRunnable() {
return new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
};
}
| 上述例子是本章所有示例的基础。 |
执行多个sleepRunnable(睡眠可运行)任务,你可以注册任务和
执行runTasks()方法任务处理器,如下示例所示:
TasksHandler handler = TasksHandler.builder()
.task("1", sleepRunnable())
.task("2", sleepRunnable())
.task("3", sleepRunnable())
.build();
handler.runTasks();
为了监听任务执行的情况,你可以注册一个实例
一个任务监听器其中任务处理器.这个Recipes
提供适配器TasksListenerAdapter如果你不想
实现完整的接口。听者会提供各种钩子
倾听任务执行事件。以下示例展示了我的任务监听器类:
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) {
}
}
你可以选择使用建材工具注册听众,或者直接通过任务处理器如下示例所示:
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:
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 方法
指示状态机从错误状态返回准备状态,你又可以运行任务。
以下示例展示了如何实现:
TasksHandler handler = TasksHandler.builder()
.task("1", sleepRunnable())
.task("2", sleepRunnable())
.task("3", sleepRunnable())
.build();
handler.runTasks();
handler.fixCurrentProblems();
handler.continueFromError();