Spring Statemachine 3.0.0-RC1 版本發布

發布 | Janne Valkealahti | 2020 年 12 月 11 日 | ...

是的,我們正邁向反應式!

我很高興代表團隊和所有貢獻者宣布,Spring Statemachine 3.0.0 的第一個候選版本已經發布,並且可以從我們的里程碑儲存庫取得。

此版本的主要功能包括

  • 與狀態機相關的 API 現在具有反應式方法。
  • 從功能的角度來看,此版本等同於 2.2.x2.3.x2.4.x 分支中的內容,除了反應式變更之外。
  • 我們選擇與最近發布的 Spring Boot 2.4.1 對齊。

在內部,一切基本上都建立在反應式概念之上,同時我們仍然保留舊樣式的方法來處理阻塞世界。 我們的計劃是看看何時以及是否有可能逐步擺脫阻塞世界。 現在來談談新的 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();

專案頁面 | GitHub | 問題 | 文件

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

取得領先

VMware 提供培訓和認證,以加速您的進度。

了解更多

獲得支持

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二進制文件。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部