スプリング ステートマシンの 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";
}