0

スプリング ステートマシンの Persist サンプルを 2 つの異なるステート マシン構成に拡張しようとしています。 http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#statemachine-examples-persist

だから私は

  • 新しいスキーマを追加しました
  • テストデータを追加しました
  • Persist、PersistCommandのコードを複製し、それらを私のケースに適合させました

これまでのところ大したことはありません。次に、構成に進みます。

  • StateMachineConfig (および @EnableStateMachine アノテーション) を削除しました
  • StateMachineConfiguration を Bean として PersistHandlerConfig に追加し、Builder を使用する
  • その構成を複製し、それを私のユースケースに適合させました
  • 明らかに、私のケースの Order のようなクラスを作成しました

さらに、AbstractStateMachineCommands クラスを適応させ、そこにステートマシンのリストを自動配線しました。start/stop および state メソッドは、すべてのステート マシンの状態を開始/停止および出力するようになりました (ここでは、出力や変数は気にしません)。

発生する問題は次のとおりです。

  • 永続化は機能しなくなりました
  • アプリケーションと両方のステート マシンを起動できます
  • すべての persist 呼び出しと myUseCase 呼び出しを使用できますが、永続的なデータには取り組んでいません。
  • たとえば、永続化プロセス 1 を呼び出すと、アプリケーションは基になる SM の状態を PROCESSING に変更しますが、永続化されたデータは変更されません。
  • デバッグ中に、LifecycleObjectSupport で getTaskExecutor メソッドが null を返すことを解決できました (元の例では、Bean ファクトリは SyncTaskExecutor のインスタンスを返します)。
  • さらに、TestEventListener はどのステート マシンでも機能しなくなったようです。
  • ステート マシン Bean を含むいずれかの構成で @EnableStateMachine を使用すると、StateMachineConfiguration の afterPropertiesSet で NPE が発生します。

それで、誰か私がどこでそれを台無しにしたか教えてもらえますか? それとも、Persist レシピは 2 つのステート マシンには適用できないのでしょうか?

どうもありがとう。

コード例: Application.java には、次の構成とエンティティが含まれるようになりました。

    @Configuration
static class PersistHandlerConfig {

    @Bean
    public Persist persist() throws Exception {
        return new Persist(persistStateMachineHandler());
    }

    @Bean
    public PersistStateMachineHandler persistStateMachineHandler() throws Exception {
        return new PersistStateMachineHandler(persistSm());
    }

    @Bean
    public StateMachine<String, String> persistSm() throws Exception{

        Builder<String, String> builder = StateMachineBuilder.builder();
        builder.configureStates()
            .withStates()
                .initial("PLACED")
                .state("PROCESSING")
                .state("SENT")
                .state("DELIVERED");

        builder.configureTransitions()
            .withExternal()
                .source("PLACED").target("PROCESSING")
                .event("PROCESS")
                .and()
            .withExternal()
                .source("PROCESSING").target("SENT")
                .event("SEND")
                .and()
            .withExternal()
                .source("SENT").target("DELIVERED")
                .event("DELIVER");

        return builder.build();
    }
}

@Configuration
static class TicketPersistHandlerConfig {

  @Bean
  public TicketPersist ticketPersist() throws Exception {
    return new TicketPersist(ticketPersistStateMachineHandler());
  }

  @Bean
  public PersistStateMachineHandler ticketPersistStateMachineHandler() throws Exception {
    return new PersistStateMachineHandler(buildMachine());
  }

  @Bean
  public StateMachine<String, String> buildMachine() throws Exception {

       Builder<String, String> builder = StateMachineBuilder.builder();
       builder.configureStates()
           .withStates()
               .initial("PRINTED")
               .state("BOOKED")
               .state("SOLD")
               .state("DELIVERED");

       builder.configureTransitions()
           .withExternal()
               .source("PRINTED").target("BOOKED")
               .event("BOOK")
               .and()
           .withExternal()
               .source("BOOKED").target("SOLD")
               .event("SELL")
               .and()
           .withExternal()
               .source("SOLD").target("DELIVERED")
               .event("DELIVER");

       return builder.build();
   }

}

public static class Order {
    int id;
    String state;

    public Order(int id, String state) {
        this.id = id;
        this.state = state;
    }

    @Override
    public String toString() {
        return "Order [id=" + id + ", state=" + state + "]";
    }

}

public static class Ticket {
  int id;
  String state;

  public Ticket(int id, String state) {
    this.id = id;
    this.state = state;
  }

  @Override
  public String toString() {
    return "Ticket [id=" + id + ", state=" + state + "]";
  }

}

TicketPersist.java と TicketPersistCommands.java は注文の場合と同じです (注文をチケットに置き換えただけです)。AbstractStateMachineCommands を次のように調整しました。

@Autowired
private List<StateMachine<S, E>> stateMachines;
@CliCommand(value = "sm start", help = "Start a state machine")
public String start() {
  for (StateMachine<S, E> stateMachine : stateMachines)
  {
    stateMachine.start();
  }
    return "State machines started";
}

@CliCommand(value = "sm stop", help = "Stop a state machine")
public String stop() {
  for (StateMachine<S, E> stateMachine : stateMachines)
  {
    stateMachine.stop();
  }
    return "State machines stopped";
}
4

2 に答える 2

0

それぞれに名前を付けて、リポジトリ モデル ファクトリを使用して 2 セットの構成でステート マシン ファクトリを構成しようとしました。

次に、persist レシピを使用する場合、statemachine ファクトリの statemachine id の文字列パラメーターを渡して statemachine インスタンスを取得し、それを渡してハンドラーを構築し、ハンドラーを使用して例のように更新する必要があります。

したがって、問題は、引数を使用してハンドラー Bean を構成する方法です。@Autowiredハンドラーまたはハンドラーが必要なものの代わりに、 で取得しbeanFactory.getBean()ます。

レシピの実装だけでうまくいきました。ただし、技術的には、モデル ファクトリを使用した構成で動作するはずです。

于 2018-05-01T17:43:36.380 に答える