diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java index e1c4aa37..ba210547 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java @@ -75,7 +75,7 @@ public class StateMachineConfigurationBuilder private SecurityRule transitionSecurityRule; private StateMachineMonitor stateMachineMonitor; private final List> interceptors = new ArrayList>(); - private StateMachineRuntimePersister persister; + private StateMachineRuntimePersister persister; /** * Instantiates a new state machine configuration builder. @@ -289,7 +289,7 @@ public class StateMachineConfigurationBuilder * * @param persister the state machine runtime persister */ - public void setStateMachineRuntimePersister(StateMachineRuntimePersister persister) { + public void setStateMachineRuntimePersister(StateMachineRuntimePersister persister) { this.persister = persister; } } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultPersistenceConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultPersistenceConfigurer.java index 25b96ef2..bd3e8608 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultPersistenceConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultPersistenceConfigurer.java @@ -33,7 +33,7 @@ public class DefaultPersistenceConfigurer extends AnnotationConfigurerAdapter, StateMachineConfigurationConfigurer, StateMachineConfigurationBuilder> implements PersistenceConfigurer { - private StateMachineRuntimePersister persister; + private StateMachineRuntimePersister persister; @Override public void configure(StateMachineConfigurationBuilder builder) throws Exception { @@ -41,7 +41,7 @@ public class DefaultPersistenceConfigurer extends } @Override - public PersistenceConfigurer runtimePersister(StateMachineRuntimePersister persister) { + public PersistenceConfigurer runtimePersister(StateMachineRuntimePersister persister) { this.persister = persister; return this; } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/PersistenceConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/PersistenceConfigurer.java index 5150de6a..370cfffa 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/PersistenceConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/PersistenceConfigurer.java @@ -36,5 +36,5 @@ public interface PersistenceConfigurer extends * @param persister the state machine runtime persister * @return configurer for chaining */ - PersistenceConfigurer runtimePersister(StateMachineRuntimePersister persister); + PersistenceConfigurer runtimePersister(StateMachineRuntimePersister persister); } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/AbstractPersistingStateMachineInterceptor.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/AbstractPersistingStateMachineInterceptor.java index 4255e675..72ecfb7b 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/AbstractPersistingStateMachineInterceptor.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/AbstractPersistingStateMachineInterceptor.java @@ -49,9 +49,10 @@ import org.springframework.statemachine.transition.TransitionKind; * * @param the type of state * @param the type of event + * @param the type of persister context object */ -public abstract class AbstractPersistingStateMachineInterceptor extends StateMachineInterceptorAdapter - implements StateMachinePersist { +public abstract class AbstractPersistingStateMachineInterceptor extends StateMachineInterceptorAdapter + implements StateMachinePersist { @Override public void preStateChange(State state, Message message, Transition transition, StateMachine stateMachine) { @@ -85,7 +86,7 @@ public abstract class AbstractPersistingStateMachineInterceptor extends St * @param context the state machine context * @param contextObj the context object */ - public abstract void write(StateMachineContext context, Object contextObj) throws Exception; + public abstract void write(StateMachineContext context, T contextObj) throws Exception; /** * Read {@link StateMachineContext} from persistent store. @@ -93,7 +94,7 @@ public abstract class AbstractPersistingStateMachineInterceptor extends St * @param contextObj the context object * @return the state machine context */ - public abstract StateMachineContext read(Object contextObj) throws Exception; + public abstract StateMachineContext read(T contextObj) throws Exception; /** * Builds the state machine context. diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/StateMachineRuntimePersister.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/StateMachineRuntimePersister.java index edb725cc..c343afee 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/StateMachineRuntimePersister.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/persist/StateMachineRuntimePersister.java @@ -16,6 +16,7 @@ package org.springframework.statemachine.persist; import org.springframework.statemachine.StateMachine; +import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.support.StateMachineInterceptor; /** @@ -25,8 +26,9 @@ import org.springframework.statemachine.support.StateMachineInterceptor; * * @param the type of state * @param the type of event + * @param the type of persister context object */ -public interface StateMachineRuntimePersister { +public interface StateMachineRuntimePersister extends StateMachinePersist { /** * Gets a {@link StateMachineInterceptor} handling machine persistence. diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/service/DefaultStateMachineService.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/service/DefaultStateMachineService.java index e2196f30..352b897c 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/service/DefaultStateMachineService.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/service/DefaultStateMachineService.java @@ -18,6 +18,8 @@ package org.springframework.statemachine.service; import java.util.HashMap; import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachineContext; import org.springframework.statemachine.StateMachineException; @@ -37,6 +39,7 @@ import org.springframework.util.Assert; */ public class DefaultStateMachineService implements StateMachineService { + private final static Log log = LogFactory.getLog(DefaultStateMachineService.class); private final StateMachineFactory stateMachineFactory; private final Map> machines = new HashMap>(); private StateMachinePersist stateMachinePersist; @@ -65,30 +68,34 @@ public class DefaultStateMachineService implements StateMachineService acquireStateMachine(String machineId) { + log.info("Acquiring machine with id " + machineId); synchronized (machines) { StateMachine stateMachine = machines.get(machineId); if (stateMachine == null) { + log.info("Getting new machine from factory with id " + machineId); stateMachine = stateMachineFactory.getStateMachine(machineId); + if (stateMachinePersist != null) { + try { + StateMachineContext stateMachineContext = stateMachinePersist.read(machineId); + stateMachine = restoreStateMachine(stateMachine, stateMachineContext); + } catch (Exception e) { + log.error("Error handling context", e); + throw new StateMachineException("Unable to read context from store", e); + } + } machines.put(machineId, stateMachine); } - if (stateMachinePersist != null) { - try { - StateMachineContext stateMachineContext = stateMachinePersist.read(machineId); - return restoreStateMachine(stateMachine, stateMachineContext); - } catch (Exception e) { - throw new StateMachineException("Unable to read context from store", e); - } - } else { - return stateMachine; - } + return stateMachine; } } @Override public void releaseStateMachine(String machineId) { + log.info("Releasing machine with id " + machineId); synchronized (machines) { StateMachine stateMachine = machines.remove(machineId); if (stateMachine != null) { + log.info("Found machine with id " + machineId); stateMachine.stop(); } } diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaPersistingStateMachineInterceptor.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaPersistingStateMachineInterceptor.java index 26e661ec..80360cf5 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaPersistingStateMachineInterceptor.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaPersistingStateMachineInterceptor.java @@ -16,7 +16,6 @@ package org.springframework.statemachine.data.jpa; import org.springframework.statemachine.StateMachineContext; -import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.persist.AbstractPersistingStateMachineInterceptor; import org.springframework.statemachine.persist.StateMachineRuntimePersister; import org.springframework.statemachine.support.StateMachineInterceptor; @@ -29,9 +28,10 @@ import org.springframework.util.Assert; * * @param the type of state * @param the type of event + * @param the type of persister context object */ -public class JpaPersistingStateMachineInterceptor extends AbstractPersistingStateMachineInterceptor - implements StateMachinePersist, StateMachineRuntimePersister { +public class JpaPersistingStateMachineInterceptor extends AbstractPersistingStateMachineInterceptor + implements StateMachineRuntimePersister { private final JpaRepositoryStateMachinePersist persist; @@ -61,7 +61,7 @@ public class JpaPersistingStateMachineInterceptor extends AbstractPersisti } @Override - public void write(StateMachineContext context, Object contextObj) throws Exception { + public void write(StateMachineContext context, T contextObj) throws Exception { persist.write(context, contextObj); } diff --git a/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java b/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java index 5b64f0af..4ec4f827 100644 --- a/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java +++ b/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java @@ -363,7 +363,7 @@ public class JpaRepositoryTests extends AbstractRepositoryTests { } @Bean - public StateMachineRuntimePersister stateMachineRuntimePersister() { + public StateMachineRuntimePersister stateMachineRuntimePersister() { return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository); } } @@ -408,7 +408,7 @@ public class JpaRepositoryTests extends AbstractRepositoryTests { } @Bean - public StateMachineRuntimePersister stateMachineRuntimePersister() { + public StateMachineRuntimePersister stateMachineRuntimePersister() { return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository); } } diff --git a/spring-statemachine-samples/datajpapersist/src/main/java/demo/datajpapersist/StateMachineConfig.java b/spring-statemachine-samples/datajpapersist/src/main/java/demo/datajpapersist/StateMachineConfig.java index b17d61e6..65ac8c88 100644 --- a/spring-statemachine-samples/datajpapersist/src/main/java/demo/datajpapersist/StateMachineConfig.java +++ b/spring-statemachine-samples/datajpapersist/src/main/java/demo/datajpapersist/StateMachineConfig.java @@ -20,7 +20,6 @@ import java.util.EnumSet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.StateMachineFactory; @@ -49,7 +48,7 @@ public class StateMachineConfig { throws Exception { config .withPersistence() - .runtimePersister(stateMachineruntimePersister()); + .runtimePersister(stateMachineRuntimePersister()); } @Override @@ -91,7 +90,7 @@ public class StateMachineConfig { } @Bean - public StateMachineRuntimePersister stateMachineruntimePersister() { + public StateMachineRuntimePersister stateMachineRuntimePersister() { return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository); } } @@ -102,8 +101,8 @@ public class StateMachineConfig { @Bean public StateMachineService stateMachineService(StateMachineFactory stateMachineFactory, - StateMachinePersist stateMachinePersist) { - return new DefaultStateMachineService<>(stateMachineFactory, stateMachinePersist); + StateMachineRuntimePersister stateMachineRuntimePersister) { + return new DefaultStateMachineService(stateMachineFactory, stateMachineRuntimePersister); } }