αα½ααααΈ α αΆα!
αααα»αα αα»αααααααΎαααΆαα―αααααααα»αααΆαα’αα·αααααααααααααΆααααααα·ααΈ ERP-class αααααΆα αααααααααααααααααααααΌαααΆαααΆααααΆαααααααααααααααααα·ααααα·ααΆαααΆαα½αααΉαα ααα½αααα αααΎααααααααα·ααααΆα’αΆααΈααααααα·αααα αΌαα―αααΆα a la EDMS α αααααα αα α»ααααααααααα·αααααααααΎαααΊααα’ααααΎαα αα αααα·ααααΆ JavaEE ααα»ααααααΎααααααα»αααααΎααΆααα·ααααααααΆααααααααΆαα½αααααΆααααααΈααααΌαααααα ααααααα½ααααα»αα αααααααα αΆαααα»ααααααααααααΆαααααααααΊααΆααα½ααααα αΌααααααααααααααααααααααααΆαααααα·αααα·αααααααααααα ααΆααααααΆα αααα αΆααααΆααα½ααααα αΌααααααααααΎα±ααααΎαααΊααααΆααααΆαααααΆαα ααααα·ααα·αααΈαα ααΆαααααααααΆαααααααα ααααα αα αααα·ααααΆ αα·αααααααααααααααΎαααααΎ ααα»ααααααααΈααααααΆαααΆααα·αααααααααα»αααΆααααααααΆααααα αΆααααααα
αα αααα»αα’αααααααααααα»αααΆαααααααΌαα’ααα αααα»αααΉααα·ααΆαα’αααΈαααα·ααααα αα·αααΆαααααΆαααααΆαααααΆααααααααααα NPO Krista ααΆααα αααα»αααααααααααΆααααααα ααΎαααααΉααααα‘ααααΎαα§ααΆα ααααααααααααααΆαααΆαααααα½αα αααααααα αΆαααΆα ααααααααΈααααααααααα’αααα’αα·αααααααααααα·ααΈ αα·ααααααααα’αααΈαααααΆαααα ααΈαααααααΆαααΆαααααααα
α’αα
αααααααααΆαααααΆαααααααα αα·ααα αα ααααααααααΆααα·αααααΆαα αααα»αα’αααααααααΌαααΆαααααΎα‘αΎαααααααα»ααααααα’ααααΎαααα·αααααααααΆαααααα½ααα αααα»αααα·αααααα·α αα ααΆαααΆααααΆααα αααααααααΆαααΆααααααα·αα’αα’αΆαααΆααΆααααα α αΎααααα ααααΆαα·αααα’αααα»ααααααααααααααααααΆαααααΎααααΆααααααααααα
ααΎ BPM ααΆααααααΉαααΆα’αααΈαααα?
ααΎααααΈααααΎααααα½αααα ααΎαααααΌαααααααααα±ααααΆαααααααΈααααα ααααα·α αα ααΎα ααα»α ααΆααααΆαααααααα αΆαααααΆαα’αα»αααααααααααααααΆαααααααΎαα αααααααααΆαααααααααα·ααααΆαα»ααα·α αα αα αααα»αααααααααααααα·ααααα·ααΆαααααααΆααααααΎαααΊααΆααααα αΌααα·αααααααα αααα»αααΌαααααΆααα·ααααααααΆααααα ααα»α αααααΆααα’αααααααΎ ααΆααααααααααΆααααααα αα·αααΆααααααααααΆαααααααααααααααααα·αααα·ααααααααα α’αα»ααααααΆααΆααααααα αΌαααΆαααΆααα½αα ααα½α ααααα»αααααΆαα αααααααααααααααα / ααΌαααααΆααα·αααααααα·ααΆα / ααααααΆα αααααΎααααΆαααΆαααα . ααΌα αααααα»αααΆαααααΆαααααααααααααααααΆααα’αα·αα·ααααΊααααααααααααα·ααααααααααΎαααΆαα’αΆααΈααααααααααααα»ααααααα½αααα
ααΎααααΈααΆαααΆααααα½α ααΎαααααΎααΆααα "α―αααΆα" αααα»αααΆαααααΆααααααααΆα’ααΌααΈαααααα»ααα·ααααααααααα½ααα½αααααΆααααααααΉαααΌαα
αααααα αΌαααΆαααΆαααΆααααΆαααα½αα’αΆα
ααααΌαααΆα "ααααΆαα" α
ααα»ααααα
α»ααααΆαααΆα
αααααααααα·ααααΆαα½ααααα
αΌα? αααΆαααΆαα·α αα·α
αα
ααΆααααΆα ααααααααααΌαααΆααααααΎαα‘αΎααααααααΆαααααααααααααααααα αααααααΌαααΆα "ααΆαα" ααΆαααααα αα·ααααααΆαααααΎααααα’αα·αα·ααααααα ααα»αααααααα·ααα
αααααα₯αααα·αααααααααΆαα»αααααΆααΆαααααα»αα
- ααΆααααααααα»ααα αααΆαα Conway;
- ααΆααααααααααΆαααααΎααααΆααα‘αΎααα·αααΌααααααααααααααααΆααααααΎαα‘αΎαααΈαα»ααααααΆααααα·ααααααααααα;
- ααΆαααΆααααααα α α·αααααααααααΆαααααα αααααα’ααααΎαααααΌαααΆααα·αααααΎαααΆαα
ααΆαααΆααααα½αααα’ααα αΆααααα½αααΎααααΈααααααααααα·ααααΆαααΆα ααααααα ααααΈαααααα·ααααΆα’αΆααΈαααααααααα αΌαααΆαααΆαααααΆαα ααΎααααΈαα»αα±αααααα»ααααααα·ααααΆα’αΆααΈαααααααΆαα½αααΉαααααα»αα»ααΆαααααΆααα½ααααα αΌα αα·ααα½αααααααααα’αααα’αα·αααααααααααα·ααΈααΈαααααΌαααΆααααα»αααΆαααααααααααΈαααααααααα·αααααΆαααααΆααααααααααααααααααα αα·ααΈααΆααααααααααΆααα»ααααααααα·αα½αα ααα½α ααα»ααααααΆαα’αα»αααααααα αΆαααΈααΆαααααΆαααααα·αααααΆαααααααΆα
- ααΆααααααααΆααααα αΆαααΆα ααααααααΆααααααΆαααααααα αααααΎαααααΆαααααααα»ααααα»αααααααααααΆαα α α αΌαααααΆααααα αααααΆαα ααα»α ααααααααΆαααααααααα»αααΆαα’αα»ααααααα αΌαααΆαααΆαα αααα (αα»ααα·ααααα·ααααΆααα½ααααα αΌαααααΆαααααααααΌαααΆααα·ααΆααααΆααΆαααααα);
- ααααα»αα»ααΆαααααΆαααααΎαααΆα αααααααα ααααααΆαα αΌααα αααα»ααααααα·ααααΆα’αΆααΈαααααααααΌα αα ααααααααα·αααααα’ααΈααααααααααααααααααααααΌαααΆαααΆαααΆαα
- α’αααα’αα·αααααααααααα·ααΈαα·αα’αΎααΎααΉαααΆααα½ααααα αΌα α αΎαα’αΆα αααααααΆααΆααααΆαααΆααααα½ααααααΆαααααΆααααααΌαααα αΌαααΆαααΆαα
- ααααααααααααα αααα½αααΈααααααααααα’αααααααΎ "ααααα" αααΆαααααααααααα’αΆα ααααααααΆααααΆα α αΎαααααα·ααααα·ααΆαααααα’αααααααΎαααααααΌαααΆαααα ααα α αΆααααααΎαααααααα·ααααααααΈαααααααααααα½ααα αααααααααα½ααααα
αα·ααΈααΆααααααα½αααααααααααΊααΎααααΈαα·α αΆαααΆα’ααααααααααααΆααα½ααααα αΌαααΆαααααααααΆαααα½ααααααααα·ααααΆ αα·αααα αΌαααΆαααΆαααααΌαα ααΎααααΈααΆαααΆααα»ααα»αααα·ααααα’αααα’αα·αααααααααααα·ααΈααΈααΆαααΎαα‘αΎαααααα ααΆααααααΎαα’ααααααααααααΆααα½ααααα αΌαααααΈαα½αααααΆαααΆαααΆααααα½α αα·αααααΆαααΆαααααΉαααααα αααααΆαα±ααΆααα·α αα½α αααα»ααααα»αααΆαααααΎαααΎααααααααααΆαα ααααα·ααΆαααααΎααΆαααΆα α§αααααααααΌαααααΆαααΆααααααααααααΆααααΎααααΈαααααα±ααα’αααααααΎααααΆααααΌααααααΎαααΆα αααΎααααααααΌαααΆααααααΆααααΆαααααΎααααΆααααααααΆ ααααα·αα’αα»ααααΆαα±ααααΆαα "ααΆαααααα½αα―ααααααΎα"α ααΆααααα½αααΆα αααΎαααααα·αααααααααΌαααααααΎααααα»αααα·αααααα·α αα ααΆααα½ααααα αΌα ααα»ααααα’αααα’αα·αααααααααααα·ααΈαα·ααα½ααα·αα’αααΈαα·α αα ααΆααααα αΆαααααααααααΆααα αααααααααααα·ααααα·ααΆα ααΆααααΈαααααΆααααααΆ α’αΆααΌαα·α αα»ααααα·ααΆα ααΆαααααΎααΆαααααααΆα ααΆααααα»α αα·αααΆαα ααα αΆαααααΆα ααΆααααααααααΌα ααΆαααΆαααααααΆαα ααΆαα ααα αΆα αα·αααΆαααααΆααααααΌαααα·ααααα ααΆα αΆαααΆα ααααα»αααΆααααααααΌαα’ααααααααΎααααααα·ααΈααΌαααααΌαααααααααΆαααΆαααααα»αααα·ααα αααα ααααΎαα αααααααα½αααΆααα’αααααααααΌαααΆαααΆαααα½α α αΎαα ααααΌααΆαααααααααΌαααααΆααα»ααααα·ααΆαααΆααα αααααα·ααααΆα’αΆααΈαααααααααΆααααααΌαααΆααΉαααΆαα ααααααααΎαα αΆαα·αααααααΆαααααΆαα’αααΈααα α»α αααααααααα α»αααααΌααααααα·ααααα»αααααα·αααΆααα½αααα
ααα»ααααααΎ BPM ααΆαα’αααΈαααααααΌαααααΎααΆαα½αααΆ? ααΆααααααΎαααΆα
αααΎααααααΆααα’αα»ααααααααΎαααΆαααΆαααΆα...
ααΆααΆααα·α ααΆαα’αα»ααααααααΎαααΆαα’αΆααΈααααααα½αααααααααααΊααΆααααααΆαααα·αααΆαααααΆαααα
αααα»ααααααααααΆαααααααΎα - ααΆαααααα·ααααααααααΆαααααααΆααααΆαααΆαααααΆααααααΌααααα αα·αααΆαααααΆααααααΆααααααααααα’ααααααααααΆαααΆαα½αααΉααααααα·ααααΆα’αΆααΈααααααααααΆααααΆαααααΆααααααΌαα αααα»αααααΈααα ααααααααααααααΈααΆαααα
αα
α»αααααααα "α―αααΆα" αα
αααα»αααααΎαααΆαα’αΆααΈααααα ααΊααΆαα»ααααααααα "α―αααΆα" αααα½αα―αα
αααααΊααΆα’αααΈαααααααΎαααΆαααΎααα
ααΌα
αα
αααα
αΆααααααΎααααααα
ααΆαααααα·ααααααΆαα’αα»αααααααααΊαααααΆαααααΆαααΆαααα αα·αααααΏαααααΆααααααΎαααααΎαααΆαα’αΆααΈαααααααΈααα’αααα αααααΆαααΆαααΆααααα αααααΆαααααααααααΌα αααααααΆαααααααα»αααααΆα αααααααααααααααααα·ααααααΎαααΆαα’αΆααΈαααααααΆααααααΈαα ααααΎα αα·αααΆαααααααα»αααααΆαα ααΆααΆαααααΌαααΆαααααΆααααΆαααα½α ααΆαααααΎααααΆααα‘αΎααα·αααΌααααααααααααΎαααΆα ααααΌα ααΆααααΎαααΆαααΆααΆ ααΌα ααααααΆααΆααΈαα½ααααααΌαααΆαααααα·ααααα·ααααααααΆα αα ααααααααααααααααααα α§αααααααααΆαααΆααΆααα’αΆαααα’α½α α αΎαααααΆααααΆαααΆαααααΆααααααΌαααααααΆαααααααααΉαααΆαααααααΆαααααααΆ (α’ααααααααααααΆααα½ααααα αΌααα·αααααΌαααΆααααα»ααααα αΆαααα αααα»αααααΆααααΆαααΆααααααα)α
αααααΊααΆα’αααΈαααααααΎαααΆαααΎααα
αααααΆααααΈααΆααααααΆααα‘αΎααα·αααΌααααααΌαααΆαααΆα
αααΎα
ααααΌαα
ααααΈααααΆαααΆααααααΊααΆααα½ααααα
αΌααααΆαααΈα
αααααααΌα
αα½αααααααΎαααΆαα’αΆααΈααααααααααα»αααααΆα
αααα»αααααααααα αααααααααΆααα·αααααααΆαααΆαααααΉααα»αααα α’αΆααααααααΈαααααααααααααααααΆααααααΎαααααΎαααΆαα’αΆααΈαααααααΆααααα§ααααααααααΎαααΎααα·αα’αα»ααααΆαα±αααααααα ααΆαααΌαααΌα ααΆααααα·αααΆααααα’αΆα ααα½αααααΆα α αΎαα§ααααααααα½αααΆααΆαααααΆαααΆααααααα½αααααα·αα αΌαα α·ααααααα»ααααα»αα ααααα’αααα’αα·ααααααα ααΆααααΆαααΆαααα’αΌαααα’ααα’αααΈαα ααΆααααααααααΆααααα»ααααααααΆαααΈααααααΆαα±ααααΆαααΌαααΆααα "αααα" αα·α "ααΎα αααα" ααΆα αααΎαα
αα·αααααΆααα·αααααΆαα ααααααααΆαααααΎααααΆαα jBPM ααΊααΆααααααΉαα’αααΈα’ααααααααααα αα·ααααααααααΆααααααΆαααΆαααααΆαααΆαααααααααΆααααααα§ααΆα αααααααααΎαααΆαα’αΆααΈαααααα ααΎαααααΆαααΎαααααααΆαααααΆαααααΎααααΆαααα·ααΈααΆαααααααααΎαααΆαααΎααααΈα’αα»αααααα·ααΈααΆααα½ααααα αΌααααααα»αααααΆααααΆααααααα·ααΈααααααααααΆαααααααΎα’ααααααααα’ααααΆαααΆαααααααααΆ αα·αααΆαα ααααααΆαααααααααααΆααααΆααααΎααα½ααΆααΈαααΆαααααΆαααααα»αααΏααααα
αααααα’ααααΎα ααα»α ααΆαααΎααΎαα’αΆα ααααα·ααααΆα: αα·ααΈααΆαααααααααΎαααΆααα αααα»ααα ααΆααααα BPM α’αα»ααααΆαα±ααααΎααααααααΆααα·α αα ααΆαααΆα αααΎαααΎααααΈααααΎααααααααααααα·ααααααααααΎαααΆαα’αΆααΈαααααααααααα»αααααΆαααΆααααααααΆααα‘αΎα ααααΎα±αααααααααΆααααΆα ααααααααΆαααΆαα α»αααααα»αααααΆαααα»αααααΎαααΆαααΆααααα αα·ααααααΆαααααααΆααααα»αααΆααααα αΆαα±ααααΎαααΌαααααΎαααΆααααααΆαα’αα»αααααααα»αααααααααααα½αα
αα»ααα·ααααα·ααααΆαα α ααΌααααααααααααΎααααΆαααααααΆααααΌαα½ααααα αΌα
ααΆααα½ααααα αΌαααααΆααααααααα αα ααΎααΆαα α αααααααΆααααααΆαααααααα»αα αααααααααααα½αααΎααα½ααΆαααααααΆααααΆαααΈααα α αΎαααΆααααααΆα API ααΆαα½αααΉααα·ααΈααΆααααααααααααΌαααΆαα αααααααααααα½ααααααΎααα½ααΆααΆααΈα’αα·αα·αα α αΎααα αααααααΉαααααΌαααααΎααΆαα α ααΌααααα α αΎααααα αΆαααααααα α’αΆαααααααΎααααΆαααααααααααααααα ααΆααΈαααΆαααΈαααααα αα·ααααΆαααΈαααα’αΆα ααΆαααΈααΆαααα αααα»ααααααα·ααΈ αα·αααααΎαααΆαααΌα ααααΆ α¬αα αααα»ααααααα·ααΈαααααααααΆα αααα»αααααΈααΈ 2 α’αααααααΌαα’αα»ααααααΆαα’αα»αααα RPC αα½αα ααα½ααα·ααααααααΌαααΆαα αΆααααααΆαααααααΆαααΆαααααααα·αααααααααααΆαα α α
ααααΌααααΆααα½ααααα αΌααααααΆααα»ααα·ααααα·αααααα½α ααα»ααααααΆααααΌαααΆαααααΎααααΆαααααΆαααΌααααΌααΆααα αααα»αααΆαα’αα»αααα αααααΆαααααΆαααΆααααααααααΆα ααααΏαααααΆαα’αα»ααααααΆααααΆα αα·ααααααα’αααα±ααααααΎααΆααααα αΎαααααααααα α αααααα»ααααααααΆααααα ααααααααααΆαααααααααΆαααΆαααα»ααα αα αααααα ααα»ααααααΆααααΎαα‘αΎαααααααααα’αααα’αα·αααααααααααααΆααααα·αααααααααΎααααΆααααΆααααα·αααΉααααα½α αααααααΆαααααα·αααΉαααΈαααα·ααΆαα’αα·αααααΆαα
ααααααααΈααΎααΆαααΎαα‘αΎαααΆααααααααααα»ααα αααα»αααΆααααααΆαααααααααααα ααΆααααΆααααα αΆαα·αααΌαα αααΆααααΆαα½αααΉαααααα·ααααα·ααΆα "ααΈαααΌαααΆαα" αα·α "αααααΈα" αααααα ααΆααΆααα·αααΆαα ααααα·αααΎαααααα·ααααΆα’αΆααΈαααααααααΎααΆαααααΆααααααΌααα½αα ααα½α αααααααα·ααααα·ααΆααα·αα’αΆα αααααΆαααΆααα α αΎαααααα·ααααα·ααΆα ααΆααΆααααααΆααααααα·ααΈαα½αα ααα½αααααααααααααΆαααααααΆαααααΆααααααΌαααΆαααααα αααααΊαα αΌαααααααααααααααα½ααααα αΆαααΆαααααΎαααααΈαα½αααα ααΆααΉααα·αα’αΆα αααα ααααααα·ααααα·ααΆα αα·αααααα ααααΆαααα ααααααααΎαα αΆαα·ααααααααααααΆααααΆα αααΎαα
- ααΆαααααΎαααααααααααααααααΌαααΆαααΆααααα α’αααααααΎααααΆαααααα αΆαααααααααΌααααααΆααα ααααΎαα αααααααα½αα
- ααΆααΌαα αααΆαααΈααααααααααΎαααααΉαααααΎααααα’αααααααΎααααΆαααααααΆαααααααα»ααααααααα‘αΆααααα ααα’ααα αααααααααΆαααΆαα αααΎαααααΌαααΆαα αΆααααααΎααααΆααααααΆααααΆαααααααααα·ααααα·ααΆαα
- Deadlocks α αΆααααααΎαααα α‘αΎα: ααααααΆαααααΆαααΎαα‘αΎαααααααΆα’αΆααααααααΆαααααΆαααα ααΎααααααααααααα·ααααα·ααΆα α ααα½ααααααααα·ααααΆα’αΆααΈααααα αα·αααΆαα αΆαααααααααΆαααααααααΉαααααα·ααααα·ααΆαα
- ααα α»αα’αααααααααα·ααααα·ααΆαααα α‘αΎα;
- αααΆαααΈααα "αααΆααα" ααΆαα½α OutOfMemory ααααα·αααΎαα·α αα ααΆααααααΌαα±ααααααΎαααΆα αα·αααααΆααααααΌααα·αααααααα½αα ααα½ααα α αΎαααααααΆαααααΆααα½ααααα αΌαααααΆαααααααααΎα±ααααΆαααΆαααααΆααααα»αααΆααααα ααααααΎαααΆααα ααΆααααα·ααααα·ααΆα "ααααΆαααΆααα»α" α
ααΆαααααααααααΆαααααααα ααΆαααααΎααααΆααααΆααΆααααΆαα α ααΌαααααα’αα‘α»αααααα½ααααα αΌαααΆαα±ααααΆαααααααΆααααααααααααΎαα»αααΆαααααααααααααααΈαα½ααα ααΆαα·αα’αΆα αα αα½α αααααα»αααΆαααΆααΆααΆαααΌαααΌα ααΆαααα»αααΆαααααα αααααααααααααα½ααααα»αααΆαα―ααααΈααΌα ααΆαααα»αααΆααααααααααααααα½ααααα ααααα·αααΎααααααααααααααΌαααΆααααααΎαα‘αΎαααααααα»αααααααααααΆ αααααΊααΆαααα αΆααα
α’αααΈαααΆαααααα½αα±ααα αΆααα’αΆαααααα ααααα·αααΎααααααααααααααααα»αααααΌαααΆαααΆαααααα αΌααααα»ααααααα·ααΈααααααααααΆ α αΎαα’αααααααΌαααααΎααΆαααααΆααααααΌαααααΆαααααααΆααααααΆαα ααΎααααΎααΌα ααααα ααΎααααΈααΆααΆααΆαααΌαααααα·ααααα·ααΆαααααΆαααααΆααααααΌαααΆααααα?
ααααα·αααΎααΆαααααΆααααααΌαααααΌαααΆαααααΎα‘αΎααα αααα»αααααα·ααααα·ααΆαααΆα ααααα‘αα αααα’αααααΉαααααΌααααααααΌαααΆααααααααΆαααααΈααΎαααα αα·ααααααααα’αΆα αα»αα α·αααααΆα α αΎαααααα»αααααΆααααΆαααααα»αααΌαα’αααααααααααα ααααααααΆααα½ααααα αΌαααααΆααααα - ααΆαααΆααααα
ααααα·ααααα·ααΆαα ααα αΆαααα αΌααααααα»αα α·αααααα ααα»ααααααΎααα·αααααΎααΆαα αααα»ααααααααααΆαααααααΎαααα ααΆαα·ααΆααααα»αααΆαααΆααΆααΌαααΆαααΏααΆααα
"Saga" ααΆαααααααααΆαα αααααααα αΆααααα·ααααα·ααΆα
ααΆαα½αααΉαααΆαααΎαα‘αΎαααΌααααααΆαααα·αααΆαααααααΆααααααΈααααΌ αααααΌαααΆααααααΆαα
ααααΌααααααααααΆααααΆαααα’α₯αααα ααααΌααααα αΆαααααΆααααααΆααααΆαααΎααααααα·ααααα·ααΆαααααααααα α αΎααααααααΈααααααααΆααααααααααααααΆαααΆαααααααααααααΈαααααααΆααααααα·ααααΆα’αΆααΈααααααααααα αααααααααΆααααΈααααα·ααααα·ααΆααααΆαααα’αΆα ααΉααα·αααααΎα±αααααααααααααα‘αααα αααΆαααΎααα·ααα ααα»ααααααααα ααααΌαααααΎαααΆααα·αααααααααα½αα αααααα’αα»ααααΆαα±ααα’ααααααααΆαααΆαααααΎα‘αΎααα·αααΌαααα αΆαααααΎαααΆααα·αααααααααααΆααααα ααααααααααα αα αααααααΆααΆαααΆαααααααΎαααΆααα ααΆααααΆααααα αα "ααα’" α
αα½αα±ααα αΆααα’αΆαααααααα αααα»ααααααααα monolithic ααααΌαααααααΆαααααααααααααα ααααα·ααΆαα’αααΈααΆααα½ααααα αΌααααααααααααααααΆααααααΆααα»α αα·ααααααααΆααα’αα·αααααΆαααααααααΆαααααΈααααα·ααααα·ααΆαααααααααΌα αα·αααΆαα αΆααααααααΆααααααααΌαααααΆααααΌαααΆαα’αααααα
ααΆαααααα ααΉαααααΎαααΆαα’αΆααΈαααααααααααΎααα αααα»ααα ααΆααααα BPM ααΆαααααα ααΆααΆααααα½αααΆαααααα»αααΆαα’αα»αααα "Sagas": ααα αΆααα»αααααα "Saga" α’αΆα ααααΌαααΆααααααΆααααΆαααααααΆααα αααα»αααααΎαααΆαα’αΆααΈααααα αα·αααααΆαααΆαααΆααααΆααααααααΎαααΆαα’αΆααΈααααααααααα αααααααααΆαααΆααααααααα»ααα "ααΆα αααΆ" α αααααΊααΎααα·αααΆαααΆαααααααΆααααααααααα½αααααααααα α’αααΈαααα’αααααααΌαααΆαααΊαααα½ααααααΆαααΆααααααΆααααααΆαααΆααΆ "αααΆαα αα ααΆαααααα" ααΆααΆαααΉααααααΌαα
ααα»αααααααααααααΆααααααααΆα "ααααα" ααααααΆαααααα
- αααααα·ααααΆα’αΆααΈαααααααΆαααααααα»αααααΆαα ααααα αΆαααΆα αααααΌααααααααΆαα
- ααΆααΉαα αΆαααΆα ααααα»αααΆαααααααα ααααΌαααΆααααΈαααααΆααααααΆαααααα αααα’αΆα ααΆαααΆααααΎαααΆαα·ααααααααΆαααααααααα monolithic α
- ααααΆααααααααααΆαααααααα»αααααΆαααααα·α α αΎααααααΌαααΆααααααααααααΆαααααα½ααααααΆαααΆαααα α‘αΎαα
- α§ααααααααα½ααα·αα·ααα αα·αααααααΆαααααααααΉαααααΌαααΆαααΆαααΆα (αααααΈααΆααΆααΌαα ααΆααα’αααααα αα»αααΆαααααααΆααααααααααααααΉαααΎαα‘αΎα)α
αααααΆαααααααααα monolithic αα»αααα·αααααααααΆααααΆαααααΎααααΆαα "Sag" ααΊαα·αααΌαα αααΆααααα αααααΆααααααΆααΈααααΌ αα·α SOA αααααααα αααααΆαα αααΎαααααααΆααΆααααα½ααααααΆααα½α α αΎα αα·αααΆααααΈαααααΆααααααΆααααααααααΌαααΆαααααααα αααα αΆααααααΎααααααα α’αααααααααααααααΆαααααΎααααΆααααααΌαααα’αΆα ααΎαααΈαα»ααα·ααααα· ααΆαα·αααααααα·αααΎααΆα API ααΆααααα½ααα αααααα·ααααΆα’αΆααΈαααααα ααααα·αα
ααΆααααα αΌααααααα·ααααΆα’αΆααΈααααααα αααα»αααααΆααααααΈααααΌ
αα αααααΎαα αΆααααααΎααα·αααααααΆαα½αααααΆααααααΈααααΌ αααα½αααα ααα»αααα½αααΆαααΎαα‘αΎαα αααααααααααααΌαααΆαααααααα·ααααΆα’αΆααΈααααααααααααααΆααααααΉαααααΆαααααααααΆααΆα±ααααΆαααΆαααΆααααΆαααααα·ααααααααα?
αα ααααααα‘ααααΎαααααΆαααααααααα BPMSs αααααα ααΆα αΆααααΌα ααΆααα ααα»αααααα»αααΆαααααααααααα·ααααΆα’αΆααΈαααααααΈααΆαααΆααααΆααα αααααΎααααααΆαααααααα·ααΆ αα·αααααΆααααααΈααααΌαααα―αααΆαααααααααααααααααΎαααα·ααΆααΆα αα·ααα»αααΊααααααααΆααααααα·ααααα·αααααα·ααααΆα’αΆααΈαααααααα αα·ααα ααΆααΆαααΆααααΆαααααα·αααααααααααΆ αααααΆααααΆα ααααα‘ααααααααΆααΈααααΌααααΆαααα αα·αααααΆαα ααααΎαααΆαα’αΆααΈααααααααα»αααααΈαααα’αα»ααααααΆααααα αααααΆαααααααααααΆααααααΌα
αα·ααΈααΆααααααααααΆαα’αααααααααααααααΆααα α’αααα’αΆα αααααΎααα»αααΆααααααααα·ααΆααΆαα αααΎαααΆααααα’αααα αΌαα α·ααα α αΎαααΆααααααααΆαααααααααΌαααααΆααααααΆααααααΈααααΌαααα·ααΆααα»ααααααααααΉαααααΆααα ααΆ "ααααΆαα" ααΈαααα ααααΎαααΆαα’αΆααΈαααααααΈαααααΆαα½αα’αΆα ααααΎαα»αααΆαααααΈαααααααα·ααΆααααΆαααα αααααΆααααΌαααΆαααααΎαα αα α»ααααααααΆαα
ααΆααα·ααααΆαααα’α·αααααααααααααα αΆαααΈαα»ααα·ααααα·ααααΆααααααα·ααΈααΆααααααααα
- ααααΆαααααααα·ααΆαααααααα·ααααα·αααααα·ααααΆα’αΆααΈααααααααααααΆα αααΎααααα»αααααααα½αααΆαααααΌαα αΆαα·αααααα’ααα αΆααααααααΆα ααα»α αααα½αααααΆααααΆαααα ααΆαααααΆααααααΌαααΆααΉαααΆααα αααααααααα·ααααΆα’αΆααΈααααααααααΎαα αΆαα·αααααααα α»ααααααΆααα αααααΆααααΆαααααααααααααααΆααααΌαα
- αααα αΆααΆαα’αα»ααααα αααααα·ααααΆα’αΆααΈαααααααααΎααΆαααΆαα½ααα·ααααααααααααΆααΆααααα
ααα»α
αααααΆααααΌα
α
ααα’αα αα·αααΊαα
- αα·ααααααααΉαααααΌαααΆα marshalled ααααααα αα·αααΌαααΆαααααααααΆααααα
- ααααΆαααααΆααΉαααΆααααΉαααααααα·ααααααα αααΎαααΆααααααΌαααΆααααααΆαααααααα·ααααΆα’αΆααΈαααααααΎααααΈααααΎαααΆα αααααΆααααααααααΆααα·ααααααααααΆαααααααΆααααΆαααααααααΆαααΆαααααααα ααααα·ααα API ααΆααααα ααααααΆααααα
- αααααα―αααΆαααααΆα αααΎααααααααα·ααααΆα’αΆααΈαααααα’αΆα ααααΎαα»ααα·ααααααααΌα ααααΆααααααααααααΆααααααΎαααΆα (αααα αΆαααα’αΆα ααααΌαααΆαααΆααααααααααααΆααααααααααΆαααΆαα»ααααααααααα»ααα·αααααα ααα»ααααααΆααααΎα±αααααα»αααααΆααααααααΆαααααααα αα·ααααααΎααααα αΆααΆααααααΉααα·αααααα αα·αααΆαααααΎα±ααααααΆαααααααΆαααα·αααααΉαααααΌα);
- αααα αΆααααα·ααααα·ααΆαα
- ααααΎαααΆαα’αΆααΈαααααααΆαα½αααΉαααααΆαααΆαααΆααααΆαα αααααααΌαααΆααααααΆαα»ααααααααΆαααααααα·ααΆ ααΊαα·ααααΈααααΆααΆαα½αααΉααα·ααααααααα α αΎααα·αααΆααα·ααΈααΆααααα½αααΎααααΈαααααααΆααααα αΆαααααα
- ααΆαααΆααααΆααααααααΆαααα·ααααααααααα ααΆααααα ααααα·ααααα·ααΆαα ααααα·αααΎαααααα·ααααΆα’αΆααΈααααααααααααΌαααΆαααααΎααΆαααααΆααααααΌααααααΆααααΈαα·αα·αααααΎαααΆαααααΉαααααΌααααα·αααααααα αα α»ααααααααααΌα αααα αΆαααΆα αααααΌαααα ααααΌαααααααΆαααααΆαααααΆααααααΌαααααα½ααααααααα αααα»ααα·αααααααααααΆαααααΎαααΆαα ααΆααααααααΆαααα·ααααααααΆααααα α’αΆα αα½ααααααααΆααααα αΆ ααα»αααααααααααααΆαααααααααΆαα αΆαα·ααααααααα αα·αααΆαααααααααΆαααΏααΆααααΆααααΌαααααααααααα
- ααΆαααααΆααααααααα αααααααΎαα αα α»ααααααααΆαα αααα»αααααΈαααα ααααΆααααααΆααααΆαα αα·ααααααα·ααααΆα’αΆααΈαααααα αΆαααΆα αααααΌαααααΎαα αα α»ααααααααΆαααααααααΆ α¬ααΆαααααΆαααααααα
ααΈαααα»α ααΎαααααΌααααααααα ααΌαααααΆααα·αα αααα αΌααα·ααααααααα αα·ααααααα·ααααΆα’αΆααΈαααααααααα αααα»αααααΆααΈααααΌαα½αα αα·ααΈααΆαααααααααα½αααααα½ααααααΆααααααΎαααααααΆααΈααααΌααΆααΆαα»ααααααααΆαααααααααααα α αΎααα·αααααα±ααααΆααααα αΆααΆαααΎα‘αΎαα ααααααα·αααααΌαααΆααααααα±αααααα₯ααα·αααααααααα:
- αααααααΆα API ααΊααααΌαααΆαααΆαααΆααααααΆααα’ααααααααααΆαα½ααααααα·ααααΆα’αΆααΈααααα (ααΆαα·ααα ααΎααααΈααααααααααααΆαα’αααααααΎααααΆααααΆαααααααααααΎαααΆαα’αΆααΈααααα) αα·αααααΆαααααααα·ααΆ API α ααΆαααΆαααΆαααα α·ααααα»αααΆαααααααααααα ααααααΆαααααΆααααααΌα API ααΆαααααααΆααααααα αα»α αα·ααααααααα
- ααΆα αΆαααΆα ααααα»αααΆααααααααααααΆααααααααααΎαααΆααααααα ααΎααααΈααΆααΆααΆαααΌαααααΎαααΆααααααααα·ααααΆα’αΆααΈαααααααΆαααααααααααΆααααααΈααααΌααΈαα½αα α αΎαααααααααααΌαααΆαααΎαα‘αΎαααΌααααααΌαααΆαααααΈαααααΆαααααααΆαααααααααα αααααΊ αα·αα’ααααααΆααααΆαα’αΆαααααααααααΆααα
- α’αααα’αα·αααααααααααα·ααααΆα’αΆααΈαααααααααΌααααα½ααα·αα·ααααααααααααΆαααα ααααα·αααΎααααΆααααααΈααααΌαα·αααααΌαααΆααααα ααααΆααΌαααα αΎαααα ααΆααααααΆααΆαααααα α½ααααααααααααααΆαααα αααα’αΆα ααΆα§αααααααααα·αααΉαααααΆαααααααα»αααΆααααααααα»αααΆαααααΈ α αΎαα’αΆα ααΆαααΆαααΆαααααααααααα·ααααΆα’αΆααΈαααααα αΆααααααααΆαααααααααααα ααΆααααααααααΈαααααααΆααα ααααα·αααΎααΆαααΆαααααΆααααααΌααα·αααααΌαααααΆαααΆαααααα
αααααΆααααααααΆαααααααα·ααΆααααΆαααααααΆααα αααα»αααααΆααααααααααααααααα ααα»αααααααααΆαααααααααααααΎαααΆαα»αααΊααααααααΆααααααΎαααΆααααααα·ααααΆα’αΆααΈαααααααααααα αΎα ααα»ααααααΆαααααα·ααΆααΆαααααααΆααα»ααααααααααααααα»αααΆα "αααα·ααΆ" αααα½αα αααααΆααααααααααΊααααΌαααΆααα·αααααΉαααααΎααααΈαααααΆααααααααααΆαααααααΆααΈααααΌαααααα»αααααααααα»αααααααααΆααααααΎα±ααααΆαααααααααααααααΆααααααα
α§ααΆα ααα αααααααΆαααααα’αααααααΎααααΆαααααα»αααααΎαααΆαα’αΆααΈααααααααααΎαααΆααα·α αα α αααααΆαααΆαααΆααααα αα αααααααΎααΆαααΆαα½αααΆααα·α αα α’αααααααΎααααΆααααααΌαααααΎαααΎαααΆααα·α αα ααΈαααααΆααα’αααα αααα»ααααααΈααΌαα αααααΆααααααΆααααΌαααααΆαααααΆα α»ααααααααΆααα·α αα ααΎαααα·ααΆαααααααΌαααααΆ αααααααΈαααααα·ααααΆα’αΆααΈααααααααα ααΆααααααΆααΆααα·αααΆαααααααααα·ααααΆα’αΆααΈααααααααα»αααα·αααααααααα·αααΆααΆααααα αΆ α αΎααααααΊααΆααΆααααααααααα½ααα½αααααααααααααααΆαααααααααααα
ααΆααα½ααααα αΌαααααΆααααααΎαααΆαα’αΆααΈαααααααΆαααααααααααααα’ααααααααΎααααααα·ααΈ
ααΌα αααααΆααααααΆααααΆαααΎ α’ααααααααΎααααααα·ααΈααααΌαααααααΌαααΆαααα ααααΈαααααααα αα ααααα αα·ααα·αααααααααααΆαα’αα»ααααα’αααααααααααααααα·ααΈααΆα αααΎα ααΌα ααααααα’αΆα ααΉαααα’ααααΎααα·αααΆαααααΆαα’αα·ααααααααα’α
α αΌαααΎαααααΆααΆααααααααΆααααα αΆαααΆα ααααααααααααΆααα½α ααααααααΎαααΆαα·ααααααααΆααα’αααααα αααααΉαααααΆαααΆαα·α αα ααΆα "α αααα" αααααΆαααααααααΉααααααα·ααΈα ααα½αααΈ ααααα½αααΆααΈαα½αααααααααααααααααΆααααΆαααα½αα "app1", "app2", "app3" α
αα ααΆααααα»ααααααα·ααΈααΈαα½αα ααααΎαααΆαα’αΆααΈαααααααααΌαααΆαα αΆααααααΎααααα αΆααααααΎα "αααααΆαα" ααΆααααα‘αΆααααα»ααα½ααααα αΌαααααΆα ααΆααααααΆαααααα "ααΆαα" ααΉαααΎααα½ααΆααΆααα
α αααΆααααααααα:
- α’ααααααααΈαα½αααΊααΆα’αααα αΆααααααΎαα ααΆααα’ααααΎαα’ααααααααααααααα±ααα αΌααα½ααααα»αα αααα α αΆααααααΎαα αααα αα·αα’αΆα αααα ααααΆααΆαααααααααα
- α’αααααααααααααααααααΆαααΈααΆαα αΌααα½ααααααα½ααααα αααα»αα αααα "ααααΆαα" ααααΆαα αα·ααα αα αα·αα’ααααααααααΌαα
- αααααΆααααΈααα½αααΆαααΆαα α’ααααααααααΎαααΎαα’αααααααααα αΌααα½ααααααααα α αΎααααααΌαααΆαααα ααΆααα α ααα½αααα»αααααΆααααααΌαααααΌαααΆαααΆαα;
- α’ααααααααααΆαααααΆα "ααΆααα" αααααα α»αααΆαα½αααΉαααΆααααααΌαααΆααααΈαα½αααααα’αααααααααα αα ααααααααΆαααα’αα α’ααααααα αΆαα ααααΈα ααααααααααααΆαααΆαααααΈαααααα
- ααααα·αβααΎβααΈα‘αΆααβααααΌαβααΆαβααβαα»αβα±ααβαα βααααΆααβα―α ααΆααβααΆαβαααααΆαβααααΆαβααΆαβα αΆαα ααβααααβααΆαα;
- αα ααααααα’ααααααααΆααα’ααααααΌαααΆααα»αα αα α’ααααααααααΌαααΉααααααΆαααΆα ααααααΆααααα ααα ααααα·αααΎααΆααα αΆαα ααααΈα ααααααΆααααα ααΆαααα ααααααΎααΆαα ααααααΎααααΈαααα ααααΆα
ααΎααααΈαααααααΆααααα αΆααα αααα»αααΉαααααΎ DSL ααααααΎααααααΆααααααΎαααΆαα’αΆααΈααααα αααα’αα»ααααΆαα±ααααΎααα·αααααΆα’αααΈαααααα·ααααΆαα αααα»α Kotlin αααααααα½αα’αααααααΆααΆαα½αααΉαααααα boilerplate α’αααααααΆα
ααααΎαααΆαα’αΆααΈαααααααααα’ααααααααααΌα (α α ααΆααααΆααΆα’αααααααΎαα αααα) ααΉαααααΎαααΆααα αααα»ααααααα·ααΈ app1α
ααααΆααααααΌαα’αααααα
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList : ArrayList<PlayerInfo>()
// ΠΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ°: ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
var playerName: String by persistent("Player1")
var energy: Int by persistent(30)
var players: PlayersList by persistent(PlayersList())
var shotCounter: Int = 0
}
// ΠΡΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°: ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠΈ
// ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
version = 1) {
// ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈΠ³ΡΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΠΈΠ³ΡΡ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ
uniqueConstraint = UniqueConstraints.singleton
// ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΡΠΎΡΡΠΎΠΈΡ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠΎΡΠ΅ΡΡ
val sendNewGameSignal = signal<String>("NewGame")
val sendStopGameSignal = signal<String>("StopGame")
val startTask = humanTask("Start") {
taskOperation {
processCondition { players.size > 0 }
confirmation { "ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΠΎΡΡ ${players.size} ΠΈΠ³ΡΠΎΠΊΠΎΠ². ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ?" }
}
}
val stopTask = humanTask("Stop") {
taskOperation {}
}
val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... join player ${signal.data} ...")
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... player ${signal.data} is out ...")
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val throwStartBall = messageSend<Int>("Ball") {
messageData = { 1 }
activation = { selectNextPlayer() }
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
// Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΡΠ΅ΠΌ Π³ΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈΠ· ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ
Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠ΅ΠΉ
startFrom(sendNewGameSignal)
.fork("mainFork") {
next(startTask)
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut)
.branch("checkPlayers") {
ifTrue { players.isEmpty() }
.next(sendStopGameSignal)
.terminate()
ifElse().next(waitPlayerOut)
}
}
startTask.fork("afterStart") {
next(throwStartBall)
.branch("mainLoop") {
ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
ifElse().next(waitBall).next(throwBall).loop()
}
next(stopTask).next(sendStopGameSignal)
}
// ΠΠ°Π²Π΅ΡΠ°Π΅ΠΌ Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
sendNewGameSignal.onExit { println("Let's play!") }
sendStopGameSignal.onExit { println("Stop!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
val player = process.players.random()
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
ααααααααΈααΎααΆαααααα·ααααα·αααααα·ααααΆα’αΆααΈααααα ααΌαααΆαααΎα’αΆα αααααΎαααααΌααααα»ααααααΎαααΆαα’αΆααΈααααα αααα’αΆα ααΎαααΎααααα»αααααααααΆααααΆααααΆαα ααΎααα·αααΆααααΆαα’αα»αααααααααα·ααΈααΎαααΎααα α‘αΎααα ααΌα ααααααΎαααααΌαα αααΆααααααααα·α αααα»αααΆαααΌα (αα ααΈααααααα»αααΆαααααα½αααΆααααααΆαα BPMN ααααα·α ααΆααααααΉαααΆαααααΎααααΆααα αααααααΆα ααΎααααΈαααααα’ααΆααααΈαααααΆααααααααΆααααΆαααΆαα½αααΌαααΆαααααα)α
app2 ααΉααα½ααααα αΌαααααΎαααΆαα’αΆααΈαααααααααα’ααααααααααααααα
ααααΆαα RandomPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList: ArrayList<PlayerInfo>()
class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {
var playerName: String by input(persistent = true,
defaultValue = "RandomPlayer")
var energy: Int by input(persistent = true, defaultValue = 30)
var players: PlayersList by persistent(PlayersList())
var allPlayersOut: Boolean by persistent(false)
var shotCounter: Int = 0
val selfPlayer: PlayerInfo
get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}
val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer",
version = 1) {
val waitNewGameSignal = signalWait<String>("NewGame")
val waitStopGameSignal = signalWait<String>("StopGame")
val sendPlayerJoin = signal<String>("PlayerJoin") {
signalData = { playerName }
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
eventCondition = { signal ->
signal.sender.processInstanceId != process.id
&& !process.players.any { signal.sender.processInstanceId == it.id}
}
handler = { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
}
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
allPlayersOut = players.isEmpty()
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val receiveHandshake = messageWait<String>("Handshake") { message ->
if (!players.any { message.sender.processInstanceId == it.id}) {
players.add(PlayerInfo(
message.data!!,
message.sender.domain,
message.sender.processInstanceId))
}
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
startFrom(waitNewGameSignal)
.fork("mainFork") {
next(sendPlayerJoin)
.branch("mainLoop") {
ifTrue { energy < 5 || allPlayersOut }
.next(sendPlayerOut)
.next(waitBall)
ifElse()
.next(waitBall)
.next(throwBall)
.loop()
}
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut).next(waitPlayerOut)
next(receiveHandshake).next(receiveHandshake)
next(waitStopGameSignal).terminate()
}
sendPlayerJoin.onExit { println("$playerName: I'm here!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
val player = if (process.players.isNotEmpty())
process.players.random()
else
process.selfPlayer
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
ααααΆααααΆαα
αα αααα»ααααααα·ααΈ app3 ααΎαααΉααααααΎαα’αααααααααααΆαα’αΆαααααα·αα·ααΆαα»αααααΆααααα·α ααααα½α α αααα½αα±ααααΆαααααΎαααΎαα’αααααααααααΆαααααα ααααα ααΆααααΉαααααΎαα ααΆααααα½ααααααααΆααα»ααα·αα
ααααΆαα RoundRobinPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList: ArrayList<PlayerInfo>()
class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {
var playerName: String by input(persistent = true,
defaultValue = "RoundRobinPlayer")
var energy: Int by input(persistent = true, defaultValue = 30)
var players: PlayersList by persistent(PlayersList())
var nextPlayerIndex: Int by persistent(-1)
var allPlayersOut: Boolean by persistent(false)
var shotCounter: Int = 0
val selfPlayer: PlayerInfo
get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}
val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
name = "RoundRobinPlayer",
version = 1) {
val waitNewGameSignal = signalWait<String>("NewGame")
val waitStopGameSignal = signalWait<String>("StopGame")
val sendPlayerJoin = signal<String>("PlayerJoin") {
signalData = { playerName }
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
eventCondition = { signal ->
signal.sender.processInstanceId != process.id
&& !process.players.any { signal.sender.processInstanceId == it.id}
}
handler = { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
}
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
allPlayersOut = players.isEmpty()
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val receiveHandshake = messageWait<String>("Handshake") { message ->
if (!players.any { message.sender.processInstanceId == it.id}) {
players.add(PlayerInfo(
message.data!!,
message.sender.domain,
message.sender.processInstanceId))
}
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
startFrom(waitNewGameSignal)
.fork("mainFork") {
next(sendPlayerJoin)
.branch("mainLoop") {
ifTrue { energy < 5 || allPlayersOut }
.next(sendPlayerOut)
.next(waitBall)
ifElse()
.next(waitBall)
.next(throwBall)
.loop()
}
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut).next(waitPlayerOut)
next(receiveHandshake).next(receiveHandshake)
next(waitStopGameSignal).terminate()
}
sendPlayerJoin.onExit { println("$playerName: I'm here!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
var idx = process.nextPlayerIndex + 1
if (idx >= process.players.size) {
idx = 0
}
process.nextPlayerIndex = idx
val player = if (process.players.isNotEmpty())
process.players[idx]
else
process.selfPlayer
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
ααΎαα·αααΌα ααααααα’αΆαααααα·αα·ααΆααααα’αααααααα·ααα»αααΈαα»αααααΌα ααααααααΆααααΆααα·αααααΆααααααΌαααα
α₯α‘αΌααααααΎαααααΌαααΆαααΆαααααΎαααααααΎααααΈααααΎαααΆαααΆααα’αααααα αααα»αααΉααααααα±αααααααααΌαααααΆαααααΎαααααααααααα½αα―αααα»ααααα ααΎααααΈαα»αα±αααααααΆαα’αααααααΆαα½αααΉαααααα boilerplate (ααΆααα·α αααα»αααΆαααααΎααα·ααΆααΆαααΆααααααααααΆααααααΎααα»αααα ααΎααααΈααΆαααααααΆααα½ααααα αΌαααααααΎαααΆαα’αΆααΈααααααααααααα)α
α ααααααΆααααα()
@Test
public void testGame() throws InterruptedException {
String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
String pl1 = startProcess(app1, "InitialPlayer");
// Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΈΠ³ΡΠΎΠΊΠΈ "ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΡΡ" Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.
// ΠΠ΄Π°ΡΡ ΡΠ΅ΡΠ΅Π· sleep - ΠΏΠ»ΠΎΡ
ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π·Π°ΡΠΎ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅.
// ΠΠ΅ Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ°ΠΊ Π² ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ
ΡΠ΅ΡΡΠ°Ρ
!
Thread.sleep(1000);
// ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΈΠ³ΡΡ, Π·Π°ΠΊΡΡΠ²Π°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ
assertTrue(closeTask(app1, pl1, "Start"));
app1.getWaiting().waitProcessFinished(pl1);
app2.getWaiting().waitProcessFinished(pl2);
app2.getWaiting().waitProcessFinished(pl3);
app3.getWaiting().waitProcessFinished(pl4);
app3.getWaiting().waitProcessFinished(pl5);
}
private Map<String, Object> playerParams(String name, int energy) {
Map<String, Object> params = new HashMap<>();
params.put("playerName", name);
params.put("energy", energy);
return params;
}
αααβααΆαβααααβααΎαβαααααβα ααα»α
αα·ααααααα»αααΌαα
ΠΠ·ΡΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠ»ΡΡΠ° lock://app1/process/InitialPlayer
Let's play!
Π‘Π½ΡΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠ»ΡΡΠ° lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!
ααΈααΆααα’ααααα ααΎαα’αΆα ααΆαααΆαααααα·ααααΆαααααΆααααα½αα ααα½αα
- ααΆαα½αααΉαα§αααααα αΆαααΆα α α’αααα’αα·αααααααααααα·ααΈα’αΆα αααααΎαα’ααααααααααααΆααα½ααααα αΌααααΆααααααα·ααΈααααα·αααααΆαααααααααα·ααααΆα’αΆααΈαααααα
- ααΆααααα»αααααΆααααα·α αα ααΆααααΆα αααααααααααΆαααΆααααααααΆααα·αααααααα’αΆα ααααΌαααΆαααΆαααα αααα»αααααααααα ααααα·αααΎααΆααααΌαααΆααα½ααααα αΌαααααΌααα αααα»αααααΆαααααααααααααααααααα ααΆαααααΆααααααα αΆαα·αα’αΆα ααΆααααΆααααΆααα ααΌα αααααααααααααΆαα αααααααα αΆαα·ααΆααα αααα»αααΌαααΉαααΎααα ααΌα ααΆα
- αα ααααααααΎααααααα·ααααΆααααΆαααααΎαααΆα αααααα ααΆααΆααΆαα αΆαααΆα ααααα»αααΆααα·αααΌαααΈααΆααααΈαααααΆααααααΆααΆαααΆα ααα» αα·ααααααααααΆαααααΆααααααΌαααΈααα’αααααααΆαααααΆααααααΌααα αααα»αααααΆαααΆαααα’αααα αΌααα½ααααΆα ααααααααΆααα’ααα ααααααααα±ααααΎαααααΎα±αααααα»αααααΆαααααααααα·ααααΆ ααΎααααΈααααΎα±ααααΆαα·αααααααααα ααΉαααααΆαααααααααΉαααα·ααΆαααααΆααααα ααΎαα‘αΎαα αααα»αα§ααΆα αααααααααΎα α’ααααααααααΌααααααα±ααα αΌααα½ααααα»αα αααα αααααΆααααΈααΆαααααααΆαααΈααΆαα αΆαα ααααΈα ααααα α’ααααααααααααααααΉαααααα α»α ααΆααα±ααααΆαααα αΌααααααααααΆαα’αααΈααΆαα αΆαα ααααααααΆααααΆαααα α αΎαααααΌαααΆαααααΎαααΆααααα’αααα αΌααα½αααΆααα’ααα αααααα·ααααΆααααα·αα’αα»ααααααΆαα αααΆααααα αααααα α αΎαααΆαααααααααΆααααααααααα½ααααα»ααααααααααααααααΆαααααααααααααΆαααααΎαααΎαα
αααααΆαα ααΎαααΉααα·ααΆαα’αααΈααΆααααα»αααααΆααααααααααααααααααΆα ααΆααααααααααα½α αα·αα ααα»α αααααααααααααααΎαα
ααΆαααΆααα’αααααα·ααα αααα»ααα½ααα½αα
αααααα·ααΈαα½ααααα αΌαααααΆααΆααα’ααααααΎαααΆαααΆαα½αα‘αΆααααα»ααα½ααααα αΌαααααΆαα½α αααααααΌαααΆααααα αΆααααα»αααααααααΆαααα½ααααααΆαααΆααααα BPMQueue αα½ααααααΆααααΆα αα·ααααααΆααα BPMTopic αα½ααααααΆαααααααΆ (ααααΉαααα·ααΆααα)α ααΆαααΆααααΆαααΆααα’ααααΆαααααα½ααααα½αααΊααΆααΆααααααααααα½αα αα ααααα·ααααααα·ααααΆα’αΆααΈααααα α₯α‘αΌααααα’αααα’αΆα ααααΆαααααααααΆαααααΈααΆα αααΎαααΆααααα’αααα αΌαα α·αααααααα·αααααΎααΆαααααΆααααααΌααα ααΆααααααααααααααααα αααααΊααΆααΆαααΆααααααααααΆαααα½α ααα»ααααααΆααΆαα αΆαα·ααααα½αα ααα½α ααααα αααα»αααα·αααααα·α αα ααΆαααααααΆααααααΎαα αΆααααΌα ααΆαα·αααΌαααααΆαααααααΆααααΎαααα
ααααααΆαααΆααααα ααΆαααΆαααα’α·αααα’αααα½ααα ααΈαααα αααααα·ααΈααΈαα½ααααααααΆα "ααααααΆ" ααΈαα½ααα α αααα αΌα ααΆαααααααααααααααΆα αααα’αΆα ααααΌαααΆααααααΆααααααααα αααα»ααααααΆααααα·αααΎα’αααααααΌαααΆαααααα "αα·ααΆαααΆαααααΆαααΎαααΎα" αααααααΆαα αααααα·ααΈαααα½αα ααααα½ααααααααΎαααα αΌαααα‘αΆααααα»α ααα»αααααααααα·ααααΆα’αΆααΈαααααααααΌαααααααΎαααΆαααΆαα½αααααααααα αααααΆααα’αΆααααααΆαααΆα - α αΆαααΆα ααααααΆαααααααΆ - α ααααΆαα
ααΆαααΆααΆααΌαααΆαααΏααΆαααααααααααααα»ααα½ααααα αΌαααααΆ
ααΆαααΏααΆααααΆαα ααα»α ααΆα αααΎαα
- αααα½ααααααΆαααΆααααααΆαααααΎαααΎαααΊααΆααΆαα»ααααααααααΆααααααααΆαααααααα αα·αα ααα»α αα½ααααααΆαααα ααΆααααΌαααααΆαααΆαα’ααααααααααααααααΆααα α’ααααα½αααααααΎααααΆαα’αα»αααααααααααΆαααΆαααααααααααααααΆ αααααΆαααΆαααΆααααααα’ αα·ααα αααααααααα½αα
- ααΆα αΆαααΆα αααΎααααΈααΆααΆααΆαααΌαααΆαα’αΆα ααααΆαααααααααααα½ααααααΆαααΆα αααααΆααααΌαααααααΌαααΆααααααα ααααΈαααααα·ααΈαα½ααααα αΌαααααΆ (ααΆαα’αΆα ααααΆαααααααααααααα·ααΈααΆαα½αααΉααααααα·ααααΆα’αΆααΈααααααααααΆαα’αα»ααααααΊαα·ααΆαααΆα αα·αααΆααααααααααααΎααααΈααΆααΆ) α
- αααα½ααααααΆαααΆαααΆαααααα·α αα αααααααΆαααΆααΆααΎααΆαααΉααααααΌα "αααΆαα αα ααΆαααααα" α αααααΊααΆαααααΌαααΆαα αΆαααΆα ααααααΆααααααα·ααααα·ααΆααααα’αΆα αα»αα α·αααααΆαααα‘αΆααααα»ααα½ααααα αΌαααααΆα αα·αα αΆαααΆα αααΆαααΆαααΆααΆααααα·α "αααα" ααα ααααΎαααΆαα’αΆααΈααααα ααΆαααα½ααα·αααΆαααΆααααΎαα ααααααΆααααααααΆα α¬ααααΉαααα·ααΆαααααααα αΎαααααααααα α αΎααα αααα»ααα·α αα ααΆααα·ααααααααΆαααΆααααααΆαα ααΆααΆααααααΆααααα½ααααα»αααΆαααααααααΆααααα½ααα·αα·ααααααααααα ααΎα’αΆααΈαααααα αααααα·ααααΆααΆααΆαααααΎααΆαααΆααΆ "αααα" "α₯αααααα;
- ααΆαααααΎααΆα αα·ααααααΆααααΌαααααΆαααααααααΉαααααα·ααααα·ααΆααα½αααΆαα½αααΉαααΆαααααΆααααααΌααα
αααα»αααααΆαααΆαααααααΎαααΆαα’αΆααΈααααα αα·ααα·αααααααααα αααααΎαααααααα
α·αααααΊααααΌαααααΎααααΆα
αααα’ααα ααααααα·ααααα·ααΆα ααα»ααααααΆααΉαααααΌαααΆαααΆααΆααααααααα αααα»αααΌαααααΆααα·αααααα αα·αα’ααααα·ααΆαα‘αΎααα·αα αα αααα»ααααααα·ααΈ JEE ααΆα’αΆα ααααΌαααΆαααααΎα±ααααΆαααααααααααΎαααααα·ααΈααααααααα JTA αααα»αααααα ααα»ααααααΆααααααΆαααα αααα½ααααααΆααααααΆαααααΎαααΎαααααΌαααα’αΆα ααααΎαααΆααα αααα»αXA ; - α’ααααααααααΆαααΆαα αΌα αα·αααααΉαααα·ααΆαααααααααΌαααααααΎααΆαααΆαα½αααααα·ααααα·ααΆααααααααΆααααααΌαααααΆαααΆαααααααΎαααΆαα’αΆααΈααααααααααα ααααα·αααΎααααα·ααααα·ααΆαααααααααααΌαααΆαααααα·ααααα·α αααααΆαααα½αααΆαααααΌαααααααΌαααΆααα»αα ααα
- ααΆαβαααβαα·αβα’αΆα
βααααΌαβααΆαβαααααΌαβαααβααΆαβααβααΆαβααα α»αβααααΌαβααβααααΌαβααΆαβαααααΆβαα»αβαααα»αβααααααβαααα»αβαααβα‘ααβαα½αβ
D.L.Q. (αα½ααααα»αααααααΆαα) α αααααΆαααααααααααα ααΎαααΆααααααΎα microservice αααα·ααΆααΆα ααααα‘ααααααααααΆαα»αααΆααααααααα αααα»ααααααααααα»αααααααΆ ααααΎαα·αα·αααααα½αααΆααΆααααααα (αααααΆααααΆαααΆααααΆαααα»α αα·αααΆαααααααααα αα) αα·ααααα αΆα API αααααΆααααΆαααΎα αααααΌααααααα ααΆααα’αΆααααααΆαααααα αα·ααα»αααΆαα α’ααααααααααααααααααααα’αΆα ααααΎααΆαααΆαα½αααααΆαααααααααΆααααα ααα»α αααααΆααααα ααααααααααα½αααα - αα αααα»αααΆαααααααααα½ααααααΆα α’αααααααΌααααααααΌαα ααα½αααααΆααααααΌαα‘αΎααα·α αα·αααΆααααααΆαααααααΆαααΆαα ααα αΆα ααΎααααΈααΆαααααααααααααΆαααααΆαα αΌααα αααα»α DLQ (ααΆααααΎααααα·αα’αΆα αα αα½α αααααα»αααΆαααααΆαααΆαααΆααααααααααα’αααααΎα ααα»ααααα’αααα’αΆα ααααΎαααααααΆαααΆααααααα αα·ααααααααΌααα½αααΆαααα»αα’αα‘α»ααααααααα·ααααα·ααΆαα );
- α αΆα DLQ ααααΌαααααααΌαααΆααααα½ααα·αα·αααααΆαααααααααΆαα α αΎααααααααααααα½ααα·αα·αααααααΌαααααΌαααααΉααααα’αααααααααααααααααααα ααΌα αααααα ααααααααΆαααααα·αααΆααααααΌαααΎαα‘αΎα αα½αααα’αΆα ααααΎαααααΆαααΏαααΆααααα’αΆα ααααΎαα ααΆαα ααΆααΉαααΆααααααα "ααααααααααααααΆαα" ααααΆααααΆααα α¬ααα α»ααααααα·ααααΆα’αΆααΈαααααα
- α‘αΆααααα»ααα½ααααα αΌαααααΌαααααΆαααΆααααΎαα ααααα’ααααααΆαααααααα’αΆαααααααααααα·ααΈα ααΆαααΆααααααΆαααααααΌαααααααΎααααΆααααΆαααΌα α αΎααααααααααααααααααα·ααΈααααΌαααααΆααααααααααααααΈαα ααΌα ααααααααααααααααααα·ααΈα’ααααααΆα α’ααααααααααΉααα·αααααΆααΆαααααΎαααΆαααΆαααααααΆααΈ αα½αα
ααΆααΆαα»ααααα·ααΆααααααααα‘αΆααααααααα·ααααΆα’αΆααΈααααα
α§ααΆα αααααΌα ααααΆααααααΎαααΆαα’αΆααΈαααααα’αΆα ααα½αααΆαααΆα αα·αααααΉαααα·ααΆαααααΆα αααΎααααα»αααααααα½α αααααααΎαααΆααααααΉαα αΆααααααΎαααααααααΆα αααα»ααααααΆαα½αααααΆααα αααααΆααα’ααααααααΎααααααα·ααΈ α’αααΈααααααααΆααα½αααααΆαααα αα·αααΆααα»ααααα·ααΆαα
αααααα·ααααΆα’αΆααΈαααααααααααΎαααΆαααααΎαααΆαααααΉαααα·ααΆαααααΆααααα ααΈαα½αα ααααααααΆαααααααααΎαααΆαα’αΆααΈαααααααααααααααα½αα ααααΉαααα·ααΆαααααααααα’αΆα ααΆα
- ααΆαα αΆααααααΎαααααΎαααΆαα’αΆααΈααααα;
- αααααααΆαα’αααααααΎααααΆααααΆααααααΉααααααααΆααα αααα»αααααΎαααΆαα’αΆααΈααααα;
- ααΆαααα½αααΆα α¬αααααΆαααααααΎαααΆαα’αΆααΈαααααααααΌαααΆαααΆαα
- ααΆαααααααααα·ααΈααααααααααααααααα§ααΆα αααααααααΎαααΆαα’αΆααΈααααα;
- ααααααααααααααααΆαααΆαααα API (α§ααΆα ααα ααΆαααααΆαααααΎαααΆα)α
ααααΉαααα·ααΆαααααααααααΈαα½ααα’αΆα ααααΆααααααΌαααααΆαααΆαααααααΎαααΆαα’αΆααΈαααααα αααααααΆααα½αα ααα½αα’αΆα ααΉααααα αα α αΎααααααααΆαααααααααα’αΆα α αΆααααααΎα α αΎαααααααααααααααααααααα·αααααΆααααΆααα’αΆα ααΉαααααΆααααααΌαα ααΆααα·ααααααααΆαααΆαα½αα’αΆα αααααΆαα±ααααΆααααααααΆααα½α α¬α αααΎααααααααααΆαααΆααααααα αααα»ααα αα·α α’αααααΆαααααα’αΆα ααααααα αΆαααααΉαααα·ααΆααααααααααα α¬ααααα·αααΎαα½ααααα·αααααΌαααΆααα·ααααααααααααααΆαα½α α’αΆα αααα αααααα»αααααα·ααααα·ααΆαααΌα ααααΆα αα»αααααα·αααααα·ααααα·ααΆα ααααΆαααΆαααααΈααααααΎαααΆαα’αΆααΈαααααααααΌαααΆααααααΆαα»ααααα»αααΌαααααΆααα·αααααα αααααΆααΉααααα αΆαααααΉαααα·ααΆαααααΆααααα αααααΆααααΎαα‘αΎαα
αα·ααααααααααΎαααΆαα’αΆααΈαααααααΆααααΆααααααααααΆαα»ααααα»αααΌαααααΆααα·ααααααααααΆααααααααΊααΆα ααα»α ααΆααααα½ααααα»ααααααΆααααΆαααααΎααααΆαααααααααΎαααΆα ααααα·αααΎα’αααααααΎ SELECT FOR UPDATE α ααααα·αααΎααααα·ααααα·ααΆααα½αααΆααααααααααααΎααααΈααα½αααΆαααααΆαααΆαααααααΎαααΆαα’αΆααΈαααααααΈααΌαααααΆααααααΆααααΆαααααΆααααααΌαααΆααα ααααΆαααααα·ααααα·ααΆααααααααααααααααααααΆααΉαα’αΆα ααα½αααΆαααααΆαααΆαααΌα ααααΆαααααΆααααΆαααααΆααααααΌααα½ααααααααα α αΎααααααΆααααΈαααα ααααααα·ααααα·ααΆαααααΌα ααααα·ααααα·ααΆαααΈααΈαααΊ ααΆααΆααΆααΉαααα½αααΆαααααΆαααΆααααααΆαααααΆααααααΌααα½α α αΎαα
αααααααΎαααα»αα·αααα·αα·αααα
αααααααΆα DBMS ααΎαααααααααααΌαααΆαα
αΆαααΆα
αααΆααα’ααα
αααααΆαααΆαααΆααααα ααΆαα αΆαααααα»αα·αααα·αα·ααααααΆαααα ααααΎαααΆαα½αααΉαααΆαααΆααααΆαα αααααΆααααααΆ SELECT FOR UPDATE αα½ααααα ααααααΌαααΆααααααα αααααααααααΆαααααα ααα»αααα½αα ααα½α αααα»αααααΈαααααΆαααΆααααΆααααΎαα‘αΎαααΎααααΈααααααααααα½αα ααα½ααα αααα»ααααααα·ααααΆα’αΆααΈαααααα
αααα αΆαα½ααααααΊααΆαααααΎααααΆαααααααααΆαα αΆααααααΎαααααΎαααΆαα’αΆααΈαααααα ααααααααααα·αααΆαα§ααΆα αααααααααΎαααΆαα’αΆααΈααααα ααααα·αααΆααααααα αααα»αααΌαααααΆααα·αααααα ααΌα αααααα·ααΈααΆααααααααααΆααα·αααααΆααΉααα·αααααΎαααΆαααα ααααα·αααΎα’αααααααΌαααΆαααΆααΆααΌαααΆααααααααα§ααΆα αααααααααΎαααΆαα’αΆααΈααααααα αααα»ααα·ααΆαααΆαααΆααααΆαααα½α αααα’αααααΉαααααΌαααΆαααααααααααα»ααααΎααααΆααααααα½αα ααα½ααααααΆααααααΉαααααΆααααααΎαααΆα αα·ααα·ααΆαααΆααααααααΌαααααΆα ααΎααααΈαααααααΆααααα αΆααα ααΎαααααΎααααααΆαα αΆαααααααααααααΆαααα’αα»ααααΆαα±ααααΎαααααΎααΆαα αΆααααααΎααααΆαααααΆααααααΆααααααΆααααααααα αααα»ααααααα URI ααΆααααααααΆααααααΆααααα α
αα αααα»αα§ααΆα αααααααααΎα ααααΎαααΆαα’αΆααΈααααα InitialPlayer ααΆαααα ααααΈαααααΆααα½αα
uniqueConstraint = UniqueConstraints.singleton
ααΌα αααα αααααα ααα»βααΆαβααΆαβα’αααΈβααΆαβααα½αβαα αα·αβααΆαβαααα ααβααβααβαααααααααΌαβααααΆα αα·αααΆαααΆααααααααααααΆααααααΎαααΆαα’αΆααΈαααααααααααααααα αααααααααααα½αααααα·αααααΌαααΆααααααααα
αααα αΆααααααΎαααΆαα’αΆααΈαααααααΆαα½αααααααΆααααΆαα
αα½αααΆαααΆαααΆαααααΆαααΆαααΆααααΆαααα·αααααΉααααα½αααα»ααααααα ααα»αααααααααΆααααΆααΆαααααααΆαα’αα·αααααααααααα
αααα αΆα
αΆααααααΎααα
ααααααααΆαααααΆααααααΌαααααΌαααααΎα
αααααααααα·ααααΆα’αΆααΈααααα αα·α/α¬ααααΌααααΎαααΆαα’αΆααΈαααααα αα·ααααααΆααααΆαααααΆααααααΌαααααααααΊααααΌαααααΆααΆαα½αααΉαααααΆαααΆαα
αΆααααααααΎαααΆαα’αΆααΈααααααααααα ααααα·αααΎααΆαααααΈααααααααΆααααΆα
αααΎααα
αααα»αααΌαααααΆααα·αααααα αααααΆαααααΆααααααΌααα·αααααΌαααααΆα’αΆα
αααααΆαα±ααααΆααααα αΆααΆα
αααΎααααααΎααα½ααααααααΆααΉαααΆαααα
αααααααΎ jBPM α
α’αΆαααααααΎααααα ααααΆαααααΆααααααΌα α’αααα’αΆα ααααΎαααααααΆαααΆαααΈααα·ααΈα
- αααααΎαβααααααβααααΎαααΆαβα’αΆααΈαααααβααααΈ ααΎααααΈβαα»αβα±ααβααΆαβααΆαβααααΆααβααααΌαβαααβαα·αβαααΈααααΆβααΉαβααααααβα αΆαα α αΎαβααααΎβααΆβαααα½αβα±ααβααααααβααααΎαααΆαβα αΆααβαααβααΎαβααααΎαααΆαβααααΈβααααΈα α αααΆααα ααααα αΆααααΉαααααααααΎαααΆα "ααΌα ααΈαα»α";
- ααααΆααααααΌαααααΆαααΆαααααααααααΎαααΆαα’αΆααΈααααα αα αααααααΎαα αα α»ααααααααΆααααααα·ααααΆα’αΆααΈαααααα
αα·ααΈααΈαα½αααΊααΆααααααΆα ααα»ααααααΆααααααααα αα·ααα»ααα·ααααα·ααααααΆ α§ααΆα αααα
- ααΆαα αααααααααααα·ααααΆα’αΆααΈααααααα αααα»αααααΌααααΎαααΆαα’αΆααΈαααααααΆα αααΎα ααΆααααααΎαααα·ααΆααααααααα·ααααΆα’αΆααΈααααα;
- ααΆααΏααααΆαααααΆααααααΌαααααΆαααα ααΆαααααααα·ααααΆα’αΆααΈαααααααααΈααΊααααΌαααΆαααΆαααΆα (αα αααα»ααααααααααααα·α αα ααΆααααΆα αααααα - ααααΎαααααΆαα·α αα ααΆα);
- α’αααβα’αα·ααααααβαα·αβααΉαβαα βα ααα»α βααΆβαααβαααΌαααβα α½αβααααβα’αΆα βααααΌαβααΆαβαα»αα
αα αααα»αααΆαα’αα»αααα ααΎαααααΎαα·ααΈααΆαααααααΆααααΈα ααα»ααααααΆαααααΎααΆααααααα α α·ααααα½αα ααα½αααΎααααΈααααΎα±ααααΈαα·αααααααΎαααΆααααααΆααααα½αα
- αα αααα»αααΌαααααΆααα·αααααα ααααΆαααΆαααΆααααΆααααααααΎαααΆαα’αΆααΈαααααααααΌαααΆααααααΆαα»ααααα»ααααααααααα’αΆα α’αΆαααΆα αα·αααΆααααα½αααααΎαααΆαα αααα»ααααααα JSON α αααα’αα»ααααΆαα±ααααΆαααααΎα αααΆααααα»αααααΌαααΆαα’αα»ααααααΆαααα αααα»ααααααα·ααΈ αα·αααΆααααα α ααΆαααααααΆαα α»αααααα α’αααα’αΆα ααααΆααααα (ααΆαα·αααααΆααααααααααααα»αααΆαα’αα·ααααααααα‘α»ααααααααΆααααα α»α);
- αααααα·ααααΆα’αΆααΈααααααα½ααααα αΌααα·αααααΎαααααααααααΎαααΆαα’αΆααΈααααααα ααΌα αααααα αααααΆαα½αααΆα’αΆα αα αα½α ααΎααααΈαααα½αααΆαα’αα»αααααα½αααααααΎαααΆααααα αΌααα½αααΆαα½αααΉααααααααααΈαα½α (α§ααΆα ααα "InitialPlayerV2") α ααΆαα αααΎαα‘αΎαααΆααααααΆααα·αααααααααααΆ;
- ααααΌααααΎαααΆαααΆαααααααα αααααΎααααααΎαααααα·αααΎααΎαααααΎααΆαααααΆααααααΌααα·αααααΌαααααΆα αααααααΌαααααα α αΎαααααααααααΌαααΆααααααΆαα»ααα½αααΆαα½αααΉαααααΆαααΆαααααααΎαααΆαα
- ααααΆαααΆαααΆααααΆααααααααΎαααΆαααααΌαααΆαα’αΆαααΈααΌαααααΆααα·ααααααααΆαα»ααα ααΆααααΌααααα»ααΆααααα½α αααααΈαα·αα·ααΈααααΆαααααΎα αααΆααααα»αα’αΆα ααααΎαααΆαααΆαα½αααααα·αααΎαααααααααααΌααΆαααααΆααααααΌαα
- ααΈαα·αα·ααΈααααΆαααααΎα αααΆααααα»αααααΌαααΆαααΆαααα ααΆααααΉααααααα·ααααΆα’αΆααΈααααα α αΎαααααΌαααΆαααα α ααΆ "αααα·α" αααααΆααα§ααΆα αααααΈαα½ααααααααΎαααΆαα’αΆααΈααααααα αααααααΆαααααΆαα‘αΎααα·αααΈααΌαααααΆααα·ααααααα
- ααααα·αααΎα’αααααααΌαααΆαααααΎα αααΆααααα»αααααΆαααΆαααααααΎαααΆαααΆααα’ααα±ααααΆαααΏα αα·αααααΆααααα αααααααααΆαααΆαααααΎα αααΆααααα»αααΌαααααΆααα·αααααααα»ααΆαααΆααααα αααΎαααααΌαααΆαααααΎ ααα»ααααα’αααααααΌαααααΎααΆαααΆαα½α JSON α
ααΎα’αααααααΌαααΆαααααααααααααααααααααααΆααααααΎαααΆαα’αΆααΈααααααα?
αααααααααΆααααααΆααα·αααααΆαα αααα»αα’αααααααΆαα’αα»ααααΆαα±ααααΎαααααΎα±ααααΈαα·αααααααΎαααΆααααααΆααααα½α αααααΈααα½ααααααα αΆαααααΆααααααααΆααα ααααα·αα’αα·αααααααααααα·ααΈ αα·αααααΎα±αααααα·αααααΆαααααααααααα·ααααΆα’αΆααΈααααααα ααΆααΈααααΌααααΆααααααΆααααααΆααααΆαα ααΎααααΈαααααα ααΆαααΌααα·α αα ααΆαααα ααΆαααΆαααΆα αααΎαααααΌαααΆααααα αα ααααααααα "ααααΆα" αααααΆααααααΎαααΆαα’αΆααΈαααααααααΌαααΆααααααΎαα‘αΎα ααααΌα ααΆααΆαα»ααααααααααΆαααα ααΎααααΈαααααααΆααααα αΆαααααΆαααααααα αααα»αααα·αααααααα αΆαααααα·ααΈααΆα αααΎαα ααΎαβααΆαβααααβα ααβα ααβαααααβααααααβααΆααβααα αα·αβααααΎβα±ααβααΆαβα’αα·ααααβαααΆαααΆαβααΌαα βααΎαβααΆαβα αΌαβααααΎααααΆααβαααααβα’αΆααααΆαααααβαααβα₯αβαα·αβααααα αααααΉααααααΌαα±ααααΆαααΆααα·αααααααΉαααααα αα·ααααααααΆαα½αα ααα½αα ααΆααααααΉαα’αααΈαααααΌαααΆααααααΆαααααααααααΆαααααααα’αΆα ααΆααΆαααΎαααΉαα α·ααααααααααααααΆαααα½αααΎαα αα αααα»αα’ααααααααααΆαααααΎα‘αΎα ααΆαααα α·ααααα»αααΆαααα·α αα½α αααα»αααΊααααΌαααΆαααααα ααΎαααααααΆαααααααααααααααα½αα―α ααα»αααααα½ααααα½αα ααα½αα’αΆα ααΎαααΎαααΈα§ααΆα ααααααααΆααααα αΆαα ααααα·αααΎααΎααααααααΆααααααααααααααααΎα α’αααααααΆα ααααα‘αααα½αααΉαααααΌαααΆαα§αααα·ααααααΆα αααα»ααααααα ααΎαααΉαααΉααα»αααααα·αααΎα’ααααααα ααααα·αααααα’ααααα·α ααααα½α αααααααΎααααα½αα
ααΆαααα’αααααααΎααααΆαααααααΆαα
α»ααααααααα»ααααααααα’αΆα
α
αΌααα½ααααα»αααΆααααααααα·αααα
ααΎα’αααααααΌαααΆαααααααααααααααααααααααΆααααααΎαααΆαα’αΆααΈααααααα?
-
18,8%ααΆα αααα»αβααΆαβαααααβααβα’αααΈβαα½αβαααβαααβααΆβααΌαβααβα αΎαα
-
12,5%αααα»αα αΆααα’αΆαααααααααα»αααΆαααααααααααααααα’αααΈααΆαα’αα»ααααααααα’ααα ααΆα’αΆα ααΆααααααααα2
-
6,2%ααΎαααααΎααααααααααααααΆαααααΆαααα½α ααα»αααααααα»ααα·αα’αααΈααΆααααα½α 1
-
18,8%ααΎαααααΎαααααααααααααΆαααααΆαααα½α α’αααΈαααΊααα’ α£
-
18,8%ααΎαααααααααααααααααΆαααααααααα α£
-
25,0%αααααααααα’ααα 4
α’αααααααΎααααΆαα 16 ααΆααααΆαααααααααα α’αααααααΎααααΆαα α‘α€ ααΆααααααΌαααΆαα αΆαααΆααα
ααααα: www.habr.com