Apache zookeeper 如何在分布式状态机中使用多个Zookeeper?

Apache zookeeper 如何在分布式状态机中使用多个Zookeeper?,apache-zookeeper,spring-statemachine,Apache Zookeeper,Spring Statemachine,我试图在zookeeper的应用程序中使用分布式状态,就像,只有一个区别。我的应用程序可以与一个zookeeper一起工作,但我需要多个zookeeper地址。以下是我的配置: import jpapersistsm.enums.Events; import jpapersistsm.enums.States; import lombok.extern.slf4j.Slf4j; import org.apache.curator.framework.CuratorFramework; impor

我试图在zookeeper的应用程序中使用分布式状态,就像,只有一个区别。我的应用程序可以与一个zookeeper一起工作,但我需要多个zookeeper地址。以下是我的配置:

import jpapersistsm.enums.Events;
import jpapersistsm.enums.States;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.data.jpa.JpaPersistingStateMachineInterceptor;
import org.springframework.statemachine.data.jpa.JpaStateMachineRepository;
import org.springframework.statemachine.ensemble.StateMachineEnsemble;
import org.springframework.statemachine.listener.StateMachineListener;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.persist.StateMachineRuntimePersister;
import org.springframework.statemachine.service.DefaultStateMachineService;
import org.springframework.statemachine.service.StateMachineService;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.zookeeper.ZookeeperStateMachineEnsemble;

import java.util.EnumSet;

@Slf4j
@Configuration
@EnableStateMachineFactory
public class JpaPersistStateMachineConfiguration extends StateMachineConfigurerAdapter<States, Events> {

    @Autowired
    public JpaStateMachineRepository jpaStateMachineRepository;

    private Logger logger = LoggerFactory.getLogger(JpaPersistStateMachineConfiguration.class);

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception{

        states
                .withStates()
                .initial(States.ORDERED)
                .end(States.PAYED)
                .end(States.CANCELLED)
                .states(EnumSet.allOf(States.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<States,Events> transitions) throws Exception {

        transitions
                .withExternal().source(States.ORDERED).target(States.ASSEMBLED).event(Events.assemble).and()
                .withExternal().source(States.ASSEMBLED).target(States.DELIVERED).event(Events.deliver).and()
                .withExternal().source(States.DELIVERED).target(States.PAYED).event(Events.payment_received).and()
                .withExternal().source(States.ORDERED).target(States.CANCELLED).event(Events.cancel).and()
                .withExternal().source(States.ASSEMBLED).target(States.CANCELLED).event(Events.cancel).and()
                .withExternal().source(States.DELIVERED).target(States.CANCELLED).event(Events.cancel);
    }

    @Override
    public void configure(StateMachineConfigurationConfigurer<States,Events> config) throws Exception{

        config
                .withDistributed()
                    .ensemble(stateMachineEnsemble())
                    .and()
                .withPersistence()
                    .runtimePersister(stateMachineRuntimePersister())
                    .and()
                .withConfiguration()
                    .autoStartup(true);

    }

    @Bean
    public StateMachineEnsemble<States, Events> stateMachineEnsemble() throws Exception {
        return new ZookeeperStateMachineEnsemble<States, Events>(curatorClient(), "/app");
    }

    @Bean
    public CuratorFramework curatorClient() throws Exception {
        CuratorFramework client = CuratorFrameworkFactory
                .builder()
                .defaultData(new byte[0])
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .connectString("localhost:2181,localhost:2182,localhost:2183")
                .build();
        client.start();
        return client;
    }

    @Bean
    public StateMachineRuntimePersister<States,Events,String> stateMachineRuntimePersister(){
        return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository);
    }

    @Bean
    public StateMachineService<States,Events> stateMachineService (
            StateMachineFactory<States,Events> stateMachineFactory,
            StateMachineRuntimePersister<States,Events,String> stateMachineRuntimePersister){

        return new DefaultStateMachineService<>(stateMachineFactory, stateMachineRuntimePersister);
    }

    @Bean
    public StateMachineListener<States, Events> listener() {

        return new StateMachineListenerAdapter<States, Events>() {
            @Override
            public void stateChanged(State<States, Events> from, State<States, Events> to) {
                logger.info("*** listener: in state changed");
                if (from == null) logger.info("*** state machine initialised in state {}", to.getId());
                else logger.info("*** state changed from {} to {}", from.getId(), to.getId());
            }
        };
    }
}
.withConfiguration()
                .autoStartup(true);
计算机的状态似乎已更改,但无法在db上保持。正如我所说,问题在于我的馆长配置。因为当我使用单个Zookeeper定义connectString时,它可以很好地工作
.connectString(“localhost:2181”)


我是动物园管理员和馆长的新手,愿意接受任何帮助。提前感谢。

此配置存在问题:

import jpapersistsm.enums.Events;
import jpapersistsm.enums.States;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.data.jpa.JpaPersistingStateMachineInterceptor;
import org.springframework.statemachine.data.jpa.JpaStateMachineRepository;
import org.springframework.statemachine.ensemble.StateMachineEnsemble;
import org.springframework.statemachine.listener.StateMachineListener;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.persist.StateMachineRuntimePersister;
import org.springframework.statemachine.service.DefaultStateMachineService;
import org.springframework.statemachine.service.StateMachineService;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.zookeeper.ZookeeperStateMachineEnsemble;

import java.util.EnumSet;

@Slf4j
@Configuration
@EnableStateMachineFactory
public class JpaPersistStateMachineConfiguration extends StateMachineConfigurerAdapter<States, Events> {

    @Autowired
    public JpaStateMachineRepository jpaStateMachineRepository;

    private Logger logger = LoggerFactory.getLogger(JpaPersistStateMachineConfiguration.class);

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception{

        states
                .withStates()
                .initial(States.ORDERED)
                .end(States.PAYED)
                .end(States.CANCELLED)
                .states(EnumSet.allOf(States.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<States,Events> transitions) throws Exception {

        transitions
                .withExternal().source(States.ORDERED).target(States.ASSEMBLED).event(Events.assemble).and()
                .withExternal().source(States.ASSEMBLED).target(States.DELIVERED).event(Events.deliver).and()
                .withExternal().source(States.DELIVERED).target(States.PAYED).event(Events.payment_received).and()
                .withExternal().source(States.ORDERED).target(States.CANCELLED).event(Events.cancel).and()
                .withExternal().source(States.ASSEMBLED).target(States.CANCELLED).event(Events.cancel).and()
                .withExternal().source(States.DELIVERED).target(States.CANCELLED).event(Events.cancel);
    }

    @Override
    public void configure(StateMachineConfigurationConfigurer<States,Events> config) throws Exception{

        config
                .withDistributed()
                    .ensemble(stateMachineEnsemble())
                    .and()
                .withPersistence()
                    .runtimePersister(stateMachineRuntimePersister())
                    .and()
                .withConfiguration()
                    .autoStartup(true);

    }

    @Bean
    public StateMachineEnsemble<States, Events> stateMachineEnsemble() throws Exception {
        return new ZookeeperStateMachineEnsemble<States, Events>(curatorClient(), "/app");
    }

    @Bean
    public CuratorFramework curatorClient() throws Exception {
        CuratorFramework client = CuratorFrameworkFactory
                .builder()
                .defaultData(new byte[0])
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .connectString("localhost:2181,localhost:2182,localhost:2183")
                .build();
        client.start();
        return client;
    }

    @Bean
    public StateMachineRuntimePersister<States,Events,String> stateMachineRuntimePersister(){
        return new JpaPersistingStateMachineInterceptor<>(jpaStateMachineRepository);
    }

    @Bean
    public StateMachineService<States,Events> stateMachineService (
            StateMachineFactory<States,Events> stateMachineFactory,
            StateMachineRuntimePersister<States,Events,String> stateMachineRuntimePersister){

        return new DefaultStateMachineService<>(stateMachineFactory, stateMachineRuntimePersister);
    }

    @Bean
    public StateMachineListener<States, Events> listener() {

        return new StateMachineListenerAdapter<States, Events>() {
            @Override
            public void stateChanged(State<States, Events> from, State<States, Events> to) {
                logger.info("*** listener: in state changed");
                if (from == null) logger.info("*** state machine initialised in state {}", to.getId());
                else logger.info("*** state changed from {} to {}", from.getId(), to.getId());
            }
        };
    }
}
.withConfiguration()
                .autoStartup(true);

因为它试图在拥有机器id之前启动机器。

这是春季问题,与动物园管理员或馆长无关。这个异常与Spring和Hibernate有关。