领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多是的,我们正在进行响应式编程!
我很高兴代表团队和所有贡献者宣布 Spring Statemachine 3.0.0 的第一个候选版本已经发布,并且可以从 我们的里程碑存储库 获取。
此版本的亮点包括
2.2.x
、2.3.x
和 2.4.x
分支中的内容。在内部,一切基本上都在响应式概念之上工作,同时我们仍然保留旧式方法以用于阻塞世界。 计划是看看是否以及何时可以逐步淘汰阻塞世界。 现在说几句关于新的 api。
使用良好的旧式阻塞世界,您可以简单地发送一个事件,并且状态机返回一个布尔标志,指示该事件是否被接受。
StateMachine<String, String> stateMachine;
boolean accepted = stateMachine.sendEvent("event1");
一个稍微烦人的事情是,您无法区分事件被接受(事件导致转换)、被拒绝(拦截器错误或没有可能的转换)或被延迟(在机器配置中使用延迟事件)的情况。 我们选择丰富从事件处理方法返回的内容。
StateMachine<String, String> stateMachine;
Mono<StateMachineEventResult<String, String>> result = stateMachine
.sendEvent(Mono.just(MessageBuilder.withPayload("event1").build()));
result.subscribe();
首先,如果您熟悉 Reactor,那么显而易见的是,除非您订阅返回的 Mono
,否则不会发生任何事情,其次,Mono
中返回的类型是 StateMachineEventResult
,其中包含有关事件处理发生的更多信息。
那么 Flux
呢,只需传入一个 flux 并获得一个 flux,并在 Reactor 中尽你所能地处理它!
StateMachine<String, String> stateMachine;
Message<String> message1 = MessageBuilder.withPayload("event1").build();
Message<String> message2 = MessageBuilder.withPayload("event2").build();
Flux<StateMachineEventResult<String, String>> results = stateMachine
.sendEvents(Flux.just(message1, message2));
results.subscribe();
你的主要工作发生在状态机中的 actions 呢?原始阻塞签名是
public interface Action<S, E> {
void execute(StateContext<S, E> context);
}
新的 ReactiveAction
只是一个 java 的 Function
,类型为 StateContext<S, E>
和 Mono<Void>
public interface ReactiveAction<S, E>
extends Function<StateContext<S, E>, Mono<Void>> {}
这转换为
class MyAction implements ReactiveAction<String, String> {
@Override
public Mono<Void> apply(StateContext<String, String> context) {
return Mono.empty();
}
}
使用配置
@Configuration
@EnableStateMachine
public class StateMachineConfig extends StateMachineConfigurerAdapter<String, String> {
@Override
public void configure(StateMachineStateConfigurer<String, String> states)
throws Exception {
states
.withStates()
.initial("state1")
.state("state2");
}
@Override
public void configure(StateMachineTransitionConfigurer<String, String> transitions)
throws Exception {
transitions
.withExternal()
.source("state1").target("state2")
.actionFunction(context -> Mono.fromRunnable(() -> {
System.out.println("HI");
}));
}
}
或者以正常方式将 *action* 定义为 Function
Function<StateContext<String, String>, Mono<Void>> action =
context -> Mono.empty();