Zookeeper is a distributed version from sample Chapter 35, Turnstile.
![]() | Note |
|---|---|
|
This sample needs and external |
Configuration of this sample is almost same as turnstile sample. We
only add configuration for distributed state machine where we
configure StateMachineEnsemble.
@Override public void configure(StateMachineConfigurationConfigurer<String, String> config) throws Exception { config .withDistributed() .ensemble(stateMachineEnsemble()); }
Actual StateMachineEnsemble needs to be created as bean together
with CuratorFramework client.
@Bean public StateMachineEnsemble<String, String> stateMachineEnsemble() throws Exception { return new ZookeeperStateMachineEnsemble<String, String>(curatorClient(), "/foo"); } @Bean public CuratorFramework curatorClient() throws Exception { CuratorFramework client = CuratorFrameworkFactory.builder().defaultData(new byte[0]) .retryPolicy(new ExponentialBackoffRetry(1000, 3)) .connectString("localhost:2181").build(); client.start(); return client; }
Let’s go through a simple example where two different shell instances are started with command
@n1:~# java -jar spring-statemachine-samples-zookeeper-1.2.0.RC2.jar
First open first shell instance(do not start second instance yet).
When state machine is started it will end up into its initial state
LOCKED. Then send event COIN to transit into UNLOCKED state.
Shell1.
sm>sm start Entry state LOCKED State machine started sm>sm event COIN Exit state LOCKED Entry state UNLOCKED Event COIN send sm>sm state UNLOCKED
Open second shell instance and start a state machine. You should see
that distributed state UNLOCKED is entered instead of default
initial state LOCKED.
Shell2.
sm>sm start State machine started sm>sm state UNLOCKED
Then from either of a shells(we use second instance here) send event
PUSH to transit from UNLOCKED into LOCKED state.
Shell2.
sm>sm event PUSH Exit state UNLOCKED Entry state LOCKED Event PUSH send
In other shell you should see state getting changed automatically based on distributed state kept in Zookeeper.
Shell1.
sm>Exit state UNLOCKED Entry state LOCKED