私はSpring Statemachineにガードを持っています。(UML)Statemachine.stop()の後もSpring Statementが実行されています
@Bean
public Guard<String, String> myGuard() {
return context -> {
try {
String x = null;
x.length();
return true;
} catch (Exception e) {
context.getStateMachine().setStateMachineError(e);
context.getStateMachine().stop();
throw e;
}
};
}
もちろんこれはjava.lang.NullPointerException
です。
私はcontext.getStateMachine().stop();
を作ってから、ステーマ機械が止まっていると思っていました。
2017-11-24 18:02:55.783 INFO 30652 --- [nio-8080-exec-1] o.s.s.support.LifecycleObjectSupport : stopped org.s[email protected]367d6b09
これで停止しました。 しかし、他のすべての警備員や州や行動よりも後に呼び出されます。
エラーが表示されたら、私は間違いなくガードをfalse
に切り替えることは望ましくない、私は本当にマシンを終了したい。
リージョンは1つのみです。だから、私が理解している限り、それはちょうど止まるべきです。
これを処理する方法はありますか?または、これが起こっているときに「終了イベント」のようなものを呼び出す方法はありますか?
私はこれに対処するためのアイデアに感謝しています。
使用:
spring-boot: 1.5.8
spring-statemachine-uml 1.2.6
私はこれをこのように使用しようとしたことは一度もなく、あるレベルではこれはあなたがしてはいけないことです。あなたは本質的にマシン内部の仕組みを変更しています。私はおそらく、pointcutsを使うのが合理的で、どれくらいうまくいくか試してみるつもりです。しかし、あなたが達成しようとしていることを説明しようとすることができますか?そうすれば、助けがはるかに簡単になります。 –
私たちはいくつかの貨幣ベースの決定にステートマシンを使用しています。ガードが真実ならば、顧客は300、偽の500、(例として)を得るでしょう。しかし、エラーが発生した場合、それは常に偽になり、より高い金額が支払われます。この時点で私は 'statemachine.setStateMachineError(exception);'のようなことをすることができますし、最後に結果があれば何でも返すことはありません – Joerg
私はtry/catchをアクションに使用して、拡張状態変数。次に、選択肢(基本的には/ elseif/else構造体です)を使用して次の状態を決定し、ガードを使用してどのパスを選択するかを選択します。これは、実際にサポートされていないpointcutsを使用しようとするよりも、物事を行うためのより統計的な方法です。 –