springboot-42-状态机redis持久化
(2018-02-01 16:16:18)分类: 微服务 |
Spring 状态机的创建有两种方式,一种是通过@Configuaration在启动时创建由spring管理的单例状态机,但是这种办法创建的状态机受制于单例模式,无法获取具有大量重复配置的状态机。所以我们可以通过StateMachineBuilder来创建无状态的不受spring管理的状态机。这样可以并发处理多个同样配置的状态机。
在http://blog.sina.com.cn/s/blog_7d1968e20102wxm2.html中,我们使用了内存来保存Spring状态机中的某些状态,并在新的状态机中载入这些状态。内存毕竟受限较大,我们试图将其存入mongo或者redis,以方便状态机状态的后续处理。
l
l
1.
<dependency>
</dependency>
<dependency>
</dependency>
2.
package com.scn7th.simple;
import com.scn7th.model.Events;
import com.scn7th.model.States;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.statemachine.StateMachinePersist;
import org.springframework.statemachine.persist.DefaultStateMachinePersister ;
import org.springframework.statemachine.persist.RepositoryStateMachinePersist ;
import org.springframework.statemachine.persist.StateMachinePersister;
import org.springframework.statemachine.redis.RedisStateMachineContextRepository ;
import org.springframework.statemachine.redis.RedisStateMachinePersister ;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class PersistConfig {
@Autowired
private InMemoryStateMachinePers ist inMemoryStateMachinePersist ;
@Bean(name = "inMemoryPersister")
public StateMachinePersister<States, Events, String> inMemoryPersister() {
return new DefaultStateMachinePersi ster<>( inMemoryStateMachinePersist );
}
@Bean(name = "redisPersister")
public RedisStateMachinePersist er<States , Events> redisPersister() {
return new RedisStateMachinePersist er<>(redisPersist()) ;
}
public StateMachinePersist<States, Events, String> redisPersist() {
, Events> repository = new RedisStateMachineContext RedisStateMachineContext Repository<States Repository<>(redisConnectionFactory()) ;
RepositoryStateMachinePe return new rsist<>(repository) ;
}
@Bean
public RedisConnectionFactory redisConnectionFactory(){
new JedisConnectionFactory(jedisPoolConfig()); JedisConnectionFactory jedisConnectionFactory =
jedisConnectionFactory.setDatabase(1);
jedisConnectionFactory.setHostName("172.19.67.138");
jedisConnectionFactory.setPort(6379);
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory; return
}
@Bean
public JedisPoolConfig jedisPoolConfig(){
new JedisPoolConfig(); JedisPoolConfig jedisPoolConfig =
jedisPoolConfig.setMaxIdle(60);
jedisPoolConfig.setMaxWaitMillis(-1);
jedisPoolConfig.setMinIdle(1);
jedisPoolConfig.setMaxTotal(60);
jedisPoolConfig; return
}
}
3.
package com.scn7th.simple;
import com.scn7th.model.Events;
import com.scn7th.model.States;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.config.StateMachineBuilder;
import org.springframework.stereotype.Component;
import java.util.EnumSet;
@Component
public class MyStateMachineBuilder {
public StateMachine<States, Events> build(BeanFactory beanFactory) throws Exception {
, Events> builder = StateMachineBuilder.builder(); StateMachineBuilder.Builder<States
builder.configureConfiguration()
"hehe") .withConfiguration()
.machineId(
; .beanFactory(beanFactory)
builder.configureStates()
S0) .withStates()
.initial(States.
S3) .end(States.
class)); .states(EnumSet.allOf(States.
builder.configureTransitions()
S0) .withExternal()
.source(States.
S1) .target(States.
A) .event(Events.
S1) .and()
.withExternal()
.source(States.
S0) .target(States.
E) .event(Events.
S1) .and()
.withExternal()
.source(States.
S2) .target(States.
B) .event(Events.
S2) .and()
.withExternal()
.source(States.
S3) .target(States.
C); .event(Events.
builder.build(); return
}
}
4.
package com.scn7th.simple;
import com.scn7th.StatemachinePersistApplicationTests ;
import com.scn7th.model.Events;
import com.scn7th.model.States;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.persist.StateMachinePersister;
import javax.annotation.Resource;
public class SimpleTest extends StatemachinePersistApplicationTests{ @Resource(name = "machine1")
private StateMachine<States, Events> stateMachine1;
@Resource(name = "machine2")
private StateMachine<States, Events> stateMachine2;
@Autowired
private MyStateMachineBuilder myStateMachineBuilder;
@Autowired
private BeanFactory beanFactory;
@Resource(name = "inMemoryPersister")
private StateMachinePersister<States, Events, String> inMemoryPersister;
@Resource(name = "redisPersister")
private StateMachinePersister<States, Events, String> redisPersister;
@Test
public void testSimple() throws Exception {
stateMachine1.start();
stateMachine1.sendEvent(Events.A);
inMemoryPersister.persist(stateMachine1, "mySM");
inMemoryPersister.restore(stateMachine2, "mySM");
System.out.println(stateMachine2.getState().getId());
}
@Test
public void testRedis() throws Exception {
stateMachine1.start();
stateMachine1.sendEvent(Events.A);
redisPersister.persist(stateMachine1, "mySMRedis");
StateMachine<States, Events> stateMachine3 = myStateMachineBuilder.build(beanFactory);
redisPersister.restore(stateMachine3, "mySMRedis");
System.out.println(stateMachine3.getState().getId());
stateMachine3.sendEvent(Events.B);
System.out.println(stateMachine3.getState().getId());
}
}