无法从操作中触发事件
Unable to Trigger an Event from Action
我正在设置 spring 状态机事务,我想在 Event1 完成时启动 Event2
这些是我的状态
州 -> "INITIAL"、"SECOND"、"THIRD"
我已将交易配置为从 FIRST_EVENT 的操作发送 SECOND_EVENT,如下所示
transitions.withExternal()
.source("INITIAL")
.target("SECOND")
.event("FIRST_EVENT")
.action(new Action<String, String>() {
@Override
public void execute(StateContext<String, String> context) {
System.out.println("FIRST_ACTION_EXECUTED");
context.getStateMachine().sendEvent("SECOND_EVENT");
}
})
.and()
.withExternal()
.source("SECOND")
.target("THIRD")
.event("SECOND_EVENT")
.action(new Action<String, String>() {
@Override
public void execute(StateContext<String, String> context) {
System.out.println("TEST SUCCESS");
}
});
这里我得到 evenNotAccepted 异常,我知道原因是 statemachine.getState() 是 INITIAL,它不能直接将状态从 INITIAL 更改为 THIRD。
所以我的问题是,无论如何我可以配置我的状态机以在第一个事件完成时自动触发第二个事件
这是因为您使用的操作类型。
Spring SM 中有两种主要类型的操作 - transition 操作和 state 操作 - 它们在不同的时间解析。您可以看到这些操作的一系列解析 here.
为了触发事件进入下一个状态,您应该使用状态动作。
您可以像这样配置状态操作:
builder.configureStates()
.withStates()
.initial(SI)
.state(F1, context -> context.getStateMachine().sendEvent(E2))
.state(F2, context -> context.getStateMachine().sendEvent(E3))
.end(SF);
builder.configureTransitions()
.withExternal().source(SI).target(F1).event(E1)
.and()
.withExternal().source(F1).target(F2).event(E2)
.and()
.withExternal().source(F2).target(SF).event(E3)
.action(context -> System.out.println("Completing SM!"));
只需手动触发事件 E1
,将导致以下输出(事件 E2
和 E3
是 auto-fired 通过状态操作):
STATE ENTERED: SI
STAGE TRANSITIONS From: null To: SI
STATE EXITED: SI
STATE ENTERED: F1
STAGE TRANSITIONS From: SI To: F1
21:45:39.153 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E2, headers={id=393a5636-a760-57d6-a98b-d31eb75f048e, timestamp=1560969939152}] SF F2 F1 SI / F1 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
STATE EXITED: F1
STATE ENTERED: F2
STAGE TRANSITIONS From: F1 To: F2
21:45:39.161 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E3, headers={id=f5899e8b-e4a5-e079-3a30-66114a7accac, timestamp=1560969939161}] SF F2 F1 SI / F2 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
Completing SM!
STATE EXITED: F2
STATE ENTERED: SF
STAGE TRANSITIONS From: F2 To: SF
我正在设置 spring 状态机事务,我想在 Event1 完成时启动 Event2
这些是我的状态
州 -> "INITIAL"、"SECOND"、"THIRD"
我已将交易配置为从 FIRST_EVENT 的操作发送 SECOND_EVENT,如下所示
transitions.withExternal()
.source("INITIAL")
.target("SECOND")
.event("FIRST_EVENT")
.action(new Action<String, String>() {
@Override
public void execute(StateContext<String, String> context) {
System.out.println("FIRST_ACTION_EXECUTED");
context.getStateMachine().sendEvent("SECOND_EVENT");
}
})
.and()
.withExternal()
.source("SECOND")
.target("THIRD")
.event("SECOND_EVENT")
.action(new Action<String, String>() {
@Override
public void execute(StateContext<String, String> context) {
System.out.println("TEST SUCCESS");
}
});
这里我得到 evenNotAccepted 异常,我知道原因是 statemachine.getState() 是 INITIAL,它不能直接将状态从 INITIAL 更改为 THIRD。
所以我的问题是,无论如何我可以配置我的状态机以在第一个事件完成时自动触发第二个事件
这是因为您使用的操作类型。 Spring SM 中有两种主要类型的操作 - transition 操作和 state 操作 - 它们在不同的时间解析。您可以看到这些操作的一系列解析 here.
为了触发事件进入下一个状态,您应该使用状态动作。
您可以像这样配置状态操作:
builder.configureStates()
.withStates()
.initial(SI)
.state(F1, context -> context.getStateMachine().sendEvent(E2))
.state(F2, context -> context.getStateMachine().sendEvent(E3))
.end(SF);
builder.configureTransitions()
.withExternal().source(SI).target(F1).event(E1)
.and()
.withExternal().source(F1).target(F2).event(E2)
.and()
.withExternal().source(F2).target(SF).event(E3)
.action(context -> System.out.println("Completing SM!"));
只需手动触发事件 E1
,将导致以下输出(事件 E2
和 E3
是 auto-fired 通过状态操作):
STATE ENTERED: SI
STAGE TRANSITIONS From: null To: SI
STATE EXITED: SI
STATE ENTERED: F1
STAGE TRANSITIONS From: SI To: F1
21:45:39.153 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E2, headers={id=393a5636-a760-57d6-a98b-d31eb75f048e, timestamp=1560969939152}] SF F2 F1 SI / F1 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
STATE EXITED: F1
STATE ENTERED: F2
STAGE TRANSITIONS From: F1 To: F2
21:45:39.161 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E3, headers={id=f5899e8b-e4a5-e079-3a30-66114a7accac, timestamp=1560969939161}] SF F2 F1 SI / F2 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
Completing SM!
STATE EXITED: F2
STATE ENTERED: SF
STAGE TRANSITIONS From: F2 To: SF