- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用fork
和join
配置状态机。加入后,我想使用内部转换来调用加入状态上的操作。问题是为 withInternal()
配置的操作未触发。我尝试过 .guard(context -> true)
hack,也尝试过 .timer()
和 .timerOnce()
,但它也不起作用。
这里是配置的说明:
private void configureStates(StateMachineBuilder.Builder<String, String> builder) throws Exception {
builder.configureStates()
.withStates()
.initial("A")
.fork("B")
.join("C")
.state("A")
.state("B_")
.state("C")
.state("D")
.state("E")
.and()
.withStates()
.parent("B_")
.initial("B1")
.end("C1")
.and()
.withStates()
.parent("B_")
.initial("B2")
.end("C2")
.and()
.withStates()
.parent("B_")
.initial("B3")
.end("C3")
.end("E");
}
转换配置:
private void configureTransitions(StateMachineBuilder.Builder<String, String> builder) throws Exception {
builder.configureTransitions()
.withExternal()
.source("A")
.target("B")
.event("E0")
.action(context -> log.info("From A to B"))
.and()
.withInternal()
.source("B")
.guard(stateContext -> true)
.action(context -> log.info("At B"))
.timerOnce(50)
.and()
.withFork()
.source("B")
.target("B_")
.and()
.withExternal()
.source("B1")
.target("C1")
.event("E1")
.and()
.withExternal()
.source("B2")
.target("C2")
.event("E2")
.and()
.withExternal()
.source("B3")
.target("C3")
.and()
.withExternal()
.source("C3")
.target("A")
.event("E3")
.and()
.withJoin()
.source("B_")
.target("C")
.and()
.withInternal()
.source("C")
.guard(context -> true)
.action(context -> log.info("At C"))
.timerOnce(50)
.state("C")
.and()
.withExternal()
.source("C")
.target("D")
.action(context -> log.info("At D"))
.and()
.withInternal()
.source("D")
.guard(stateContext -> true)
.action(stateContext -> log.info("At internal D"))
.timer(10)
.and()
.withExternal()
.source("D")
.event("E4")
.target("E");
}
我还向状态机添加了一个监听器:
private StateMachineListener<String, String> listener() {
return new StateMachineListenerAdapter<String, String>() {
@Override
public void stateChanged(State<String, String> from, State<String, String> to) {
log.info("State transited from [{}] to [{}]",
from == null ? null : from.getId(),
to == null ? null : to.getId());
}
};
}
最终配置为:
private StateMachine<String, String> buildMachine() throws Exception {
StateMachineBuilder.Builder<String, String> builder = StateMachineBuilder.builder();
builder.configureConfiguration()
.withConfiguration()
.listener(listener())
.autoStartup(true);
configureStates(builder);
configureTransitions(builder);
return builder.build();
}
问题是没有调用任何内部转换操作。
我为给定的配置创建了一个小测试:
@Test
public void testForkJoin() throws Exception {
StateMachine<String, String> machine = buildMachine();
StateMachineTestPlan<String, String> plan = StateMachineTestPlanBuilder.<String, String>builder()
.defaultAwaitTime(3)
.stateMachine(machine)
.step()
.expectStates("A")
.and()
.step()
.sendEvent("E0")
.expectStates("B_", "B1", "B2", "C3")
.and()
.step()
.sendEvent("E1")
.expectStates("B_", "C1", "B2", "C3")
.and()
.step()
.sendEvent("E3")
.expectState("A")
.and()
.step()
.sendEvent("E0")
.expectStates("B_", "B1", "B2", "C3")
.and()
.step()
.sendEvent("E1")
.expectStates("B_", "C1", "B2", "C3")
.and()
.step()
.sendEvent("E2")
.expectStates("D")
.and()
.step()
.sendEvent("E4")
.expectState("E")
.and()
.build();
plan.test();
}
作为解决方法,我添加了几个外部转换(从 C
到 D
),但事实是我想省略状态 D
并通过执行现有操作作为内部转换操作来直接转换到 E
。
最佳答案
I would like to omit state D and transit directly to E by executingthe existing actions as an internal transition action.
简短回答:你不能。
Fork/Join 伪状态不应引入行为规范(例如 Action)。 Fork/Join 仅用于对 SM( transient 伪状态)中的并行操作(fork)和同步(join)进行建模。
Spring 状态机实现遵循 UML specification因此,与 fork/join 相关的操作不会被执行。
操作与特定的转换或状态相关联。
进行 JOIN 时,您可能有 N (>=2) 个源(J1E、J2E - 该其他区域的最后阶段),因此可以在从 J1E 过渡到 JOIN 阶段 (action=A1) 以及从 J2E 过渡到 JOIN 阶段 (action=A2) 时定义不同的操作。
如果您有一个需要在并行操作同步后执行的常见操作,您可以将其定义为下一个转换的一部分(例如,我相信您的 SM 案例是从 C 转换到 D 时)。
关于java - 未调用 join 后的 Spring Statemachine 内部转换操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54970154/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!