Pivotal GemFire ​​не может видеть кешированные данные в Gfsh или Pulse

Я создал приложение Spring Boot с кешем Geode / GemFire. Я хотел бы подключиться к региону, созданному Gfsh, с помощью моего приложения Spring Boot. В моем application-context.xml я использую gfe:lookup-region с идентификатором региона, созданного Gfsh.

В моем файле конфигурации Java я использую LookupRegionFactoryBean, чтобы получить ссылку на внешнюю область.

В моем классе начальной загрузки SpringBootApplication я успешно записываю в свой репозиторий, так как могу прочитать все сохраненные мной объекты. Но с помощью инструмента Gfsh или Pulse я не могу видеть свои кэшированные записи данных (или их количество, которое я сохранил).

Не могли бы вы дать здесь некоторое представление? Кроме того, я попытался использовать LocalRegionFactoryBean в моем файле конфигурации, но этот подход тоже не сработал.

Спасибо.

    application-context.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
           xmlns:gfe-data="http://www.springframework.org/schema/data/gemfire"
           xmlns:gfe="http://www.springframework.org/schema/gemfire"
           xmlns:util="http://www.springframework.org/schema/util"
           xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/gemfire http://www.springframework.org/schema/data/gemfire/spring-data-gemfire.xsd http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd">

        <context:component-scan base-package="com.example.geode"></context:component-scan>

        <util:properties id="gemfireProperties" location="context:geode.properties"/>

    <!--    <context:property-placeholder location="context:geode.properties"/>

        <bean id="log-level"><property name="log-level" value="${log-level}"/></bean>
        <bean id="mcast-port"><property name="mcast-port" value="${mcast-port}"/></bean>
        <bean id="name"><property name="name" value="${name}"/></bean>-->

        <gfe:annotation-driven/>
        <gfe-data:function-executions base-package="com.example.geode.config"/>
        <!-- Declare GemFire Cache -->
    <!--    <gfe:cache/>    -->
        <gfe:cache properties-ref="gemfireProperties"/>

        <!-- Local region for being used by the Message -->
    <!--    <gfe:replicated-region id="employee" value-constraint="com.example.geode.model.Employee" data-policy="REPLICATE"/>-->
        <gfe:lookup-region id="employee" value-constraint="com.example.geode.model.Employee" data-policy="REPLICATE"/>
    <!--        <gfe:local-region id="employee" value-constraint="com.example.geode.model.Employee" data-policy="REPLICATE"/>-->
        <!-- Search for GemFire repositories -->
        <gfe-data:repositories base-package="com.example.geode.repository"/>


    </beans>

    GeodeConfiguration.java:

    //imports not included

    @Configuration

    @ComponentScan
    @EnableCaching
    @EnableGemfireRepositories//(basePackages = "com.example.geode.repository")
    @EnableGemfireFunctions
    @EnableGemfireFunctionExecutions//(basePackages = "com.example.geode.function")

    @PropertySource("classpath:geode.properties")

    public class GeodeConfiguration {

        @Autowired
        private EmployeeRepository employeeRepository;

        @Autowired
        private FunctionExecution functionExecution;

        @Value("${log-level}") 
        private String loglevel;
        @Value("${mcast-port}") 
        private String mcastPort; 
        @Value("${name}")
        private String name;    

        Properties gemfireProperties() {

            Properties gemfireProperties = new Properties();
            gemfireProperties.setProperty(loglevel, loglevel);
            gemfireProperties.setProperty(mcastPort, mcastPort);
            gemfireProperties.setProperty(name, name);

            return gemfireProperties;
        }  

        @Bean
        CacheFactoryBean gemfireCache() {

            return new CacheFactoryBean();
        }

        @Bean
        GemfireCacheManager cacheManager() {

            GemfireCacheManager cacheManager = new GemfireCacheManager();
            try {
                CacheFactoryBean cacheFactory = gemfireCache();
                //gemfireProperties();
                //cacheFactory.setProperties(gemfireProperties());
                cacheManager.setCache(cacheFactory.getObject()); //gemfireCache().getObject());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return cacheManager;
        }

        @Bean(name="employee")
        //@Autowired
        LookupRegionFactoryBean<String, Employee> getRegion(final GemFireCache cache) 
                throws Exception {

            //CacheTypeAwareRegionFactoryBean<String, Employee> region = new CacheTypeAwareRegionFactoryBean<>();//GenericRegionFactoryBean<> //LocalRegionFactoryBean<>();

            LookupRegionFactoryBean<String, Employee> region = new LookupRegionFactoryBean<>();//GenericRegionFactoryBean<> //LocalRegionFactoryBean<>();        

            region.setRegionName("employee");

            try {
                    region.setCache(gemfireCache().getObject());
            } catch (Exception e) {
                    e.printStackTrace();
            }        
            //region.setClose(false);
            region.setName("employee");    
            //region.setAsyncEventQueues(new AsyncEventQueue[]{gemfireQueue});       
            //region.setPersistent(false);
            //region.setDataPolicy(org.apache.geode.cache.DataPolicy.REPLICATE);  //PRELOADED);   //REPLICATE);  
            region.afterPropertiesSet();

            return region;
        }

    }

    BasicGeodeApplication.java:

    //imports not provided

    @EnableGemfireRepositories
    @SpringBootApplication

    @ComponentScan("com.example.geode")
    //@EnableCaching
    @EnableGemfireCaching
    @EnableEntityDefinedRegions(basePackageClasses = Employee.class)

    @SuppressWarnings("unused")
    //@CacheServerApplication(name = "server2", locators = "localhost[10334]",
    //    autoStartup = true, port = 41414)
    public class BasicGeodeApplication {

        @Autowired
        private EmployeeRepository employeeRepository;

        @Autowired
        private EmployeeService employeeService;

        private static ConfigurableApplicationContext context;

        public static void main(String[] args) {

            context = SpringApplication.run(BasicGeodeApplication.class, args);


            BasicGeodeApplication bga = new BasicGeodeApplication();

        }

        @Bean
        public ApplicationRunner run(EmployeeRepository employeeRepository) {

            return args -> {

                Employee bob = new Employee("Bob", 80.0);
                Employee sue = new Employee("Susan", 95.0);
                Employee jane = new Employee("Jane", 85.0);
                Employee jack = new Employee("Jack", 90.0);

                List<Employee> employees = Arrays.asList(bob, sue, jane, jack);
                employees.sort(Comparator.comparing(Employee::getName));

                for (Employee employee : employees) {

                    //employeeService.saveEmployee(employee);
                    employeeRepository.save(employee);
                }

                System.out.println("\nList of employees:");

                employees //Arrays.asList(bob.getName(), sue.getName(), jane.getName(), jack.getName());
                    .forEach(person -> System.out.println("\t" + employeeRepository.findByName(person.getName())));

                System.out.println("\nQuery salary greater than 80k:");

                stream(employeeRepository.findBySalaryGreaterThan(80.0).spliterator(), false)
                    .forEach(person -> System.out.println("\t" + person));

                System.out.println("\nQuery salary less than 95k:");

                stream(employeeRepository.findBySalaryLessThan(95.0).spliterator(), false)
                    .forEach(person -> System.out.println("\t" + person));

                System.out.println("\nQuery salary greater than 80k and less than 95k:");

                stream(employeeRepository.findBySalaryGreaterThanAndSalaryLessThan(80.0, 95.0).spliterator(), false)
                    .forEach(person -> System.out.println("\t" + person));

            };

        }


    @Service 
    class EmployeeService {   

        @Autowired
        private EmployeeRepository employeeRepository;

        @CachePut(cacheNames = "employee", key = "#id")
        //@PutMapping("/")
        void saveEmployee(Employee employee) {

            employeeRepository.save(employee);
        }

        Employee findEmployee(String name) {

            return null;
        }
        //employeeRepository.findByName(person.getName())));
    }

    } 

    EmployeeRepository.java:


    @Repository("employeeRepository")
    //@DependsOn("gemfireCache")
    public interface EmployeeRepository extends CrudRepository<Employee, String> {

        Employee findByName(String name);

        Iterable<Employee> findBySalaryGreaterThan(double salary);

        Iterable<Employee> findBySalaryLessThan(double salary);

        Iterable<Employee> findBySalaryGreaterThanAndSalaryLessThan(double salary1, double salary2);
    }



Employee.java:

// imports not included

@Entity
@Region("employee")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)    
    @javax.persistence.Id
    private Long id;
    public String name;
    public double salary;

    protected Employee() {}

    @PersistenceConstructor
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return name + " salary is: " + salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }
}

person Seattle JD    schedule 31.07.2018    source источник


Ответы (1)


Я был бы очень удивлен, если бы ваше приложение Spring Boot на самом деле использовало регионы, созданные в Gfsh после попытки поиска. Это также очевидно из того факта, что вы не можете видеть данные в регионах при использовании Gfsh или Pulse после запуска приложения.

Кроме того, из вашей конфигурации не совсем очевидно, присоединяется ли ваше приложение Spring Boot к кластеру, запущенному с помощью Gfsh, поскольку вы не предоставили общий доступ к содержимому вашего geode.properties файла.

ПРИМЕЧАНИЕ. Мы вернемся к вашему файлу свойств через мгновение, поскольку то, как вы на него ссылаетесь (т.е. с context: в атрибуте location элемента <util> из схемы Spring Util), даже неверно. Фактически, весь ваш XML-файл даже недействителен! Определения компонентов без class недопустимы, если они не являются абстрактными.

Какую версию Spring Boot и Spring Data Geode / GemFire ​​(SDG) вы используете?

Судя по ссылкам на XML-схему Spring в вашем файле конфигурации XML, вы используете Spring 3.0 !? Вы не должны ссылаться на версии в объявлениях местоположения схемы. Неквалифицированная версия схемы будет версироваться на основе Spring JAR, которые вы импортировали в путь к классам вашего приложения (например, с использованием Maven).

В любом случае причина, по которой я спрашиваю, заключается в том, что я внес много изменений в SDG, что привело к его безотказной работе в случае неоднозначной или неполной конфигурации (для instance).

В вашем случае поиск немедленно завершился бы неудачей, если бы региона не существовало. И я совершенно уверен, что регионы не существуют, потому что SDG по умолчанию отключает конфигурацию кластера на узле / приложении однорангового кэша. Следовательно, ни один из регионов, созданных в Gfsh, не будет немедленно доступен для вашего приложения Spring Boot.

Итак, давайте рассмотрим простой пример. В основном я буду использовать новую модель конфигурации аннотаций SDG смешанный с некоторой конфигурацией Java для простоты использования и удобства. Я рекомендую вам прочитать эту главу в Справочном руководстве SDG, учитывая, что ваша конфигурация повсюду, и я почти уверен, что вы не понимаете, что на самом деле происходит.

Вот мое приложение Spring Boot, Apache Geode ...

@SpringBootApplication
@SuppressWarnings("unused")
public class ClusterConfiguredGeodeServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(ClusterConfiguredGeodeServerApplication.class, args);
  }

  @Bean
  ApplicationRunner runner(GemfireTemplate customersTemplate) {

    return args -> {

      Customer jonDoe = Customer.named("Jon Doe").identifiedBy(1L);

      customersTemplate.put(jonDoe.getId(), jonDoe);
    };
  }

  @PeerCacheApplication(name = "ClusterConfiguredGeodeServerApplication")
  @EnablePdx
  static class GeodeConfiguration {

    @Bean("Customers")
    LookupRegionFactoryBean<Long, Customer> customersRegion(GemFireCache gemfireCache) {

      LookupRegionFactoryBean<Long, Customer> customersRegion = new LookupRegionFactoryBean<>();

      customersRegion.setCache(gemfireCache);

      return customersRegion;
    }

    @Bean("CustomersTemplate")
    GemfireTemplate customersTemplate(@Qualifier("Customers") Region<?, ?> customers) {
      return new GemfireTemplate(customers);
    }
  }

  @Data
  @RequiredArgsConstructor(staticName = "named")
  static class Customer {

    @Id
    private Long id;

    @NonNull
    private String name;

    Customer identifiedBy(Long id) {
      this.id = id;
      return this;
    }
  }
}

Я использую Spring Data Lovelace RC1 (который включает Spring Data для Apache Geode 2.1.0.RC1). Я также использую Spring Boot 2.0.3.RELEASE, который использует ядро ​​Spring Framework 5.0.7.RELEASE, все на Java 8.

Я пропустил декларации пакетов и импорта.

Я использую Project Lombok для определения своего Customer класса.

У меня есть вложенный класс GeodeConfiguration для настройки приложения Spring Boot как «однорангового» Cache члена, способного присоединиться к кластеру Apache Geode. Однако пока он не входит ни в один кластер!

Наконец, я настроил область «Клиенты», которая «просматривается» в контексте Spring.

Когда я запускаю это приложение, оно терпит неудачу, потому что ни в коем случае не определен регион "Клиенты" ...

Caused by: org.springframework.beans.factory.BeanInitializationException: Region [Customers] in Cache [GemFireCache[id = 2126876651; isClosing = false; isShutDownAll = false; created = Thu Aug 02 13:43:07 PDT 2018; server = false; copyOnRead = false; lockLease = 120; lockTimeout = 60]] not found
    at org.springframework.data.gemfire.ResolvableRegionFactoryBean.createRegion(ResolvableRegionFactoryBean.java:146) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    at org.springframework.data.gemfire.ResolvableRegionFactoryBean.afterPropertiesSet(ResolvableRegionFactoryBean.java:96) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    at org.springframework.data.gemfire.LookupRegionFactoryBean.afterPropertiesSet(LookupRegionFactoryBean.java:72) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    ...

Это ожидаемо!

Хорошо, заходим в Gfsh и запускаем кластер.

Вы знаете, что вам нужно запустить локатор с сервером, чтобы сформировать кластер, верно? Локатор используется другими потенциальными одноранговыми узлами, пытающимися присоединиться к кластеру, чтобы они могли в первую очередь определить местонахождение кластера. Сервер необходим для создания региона «Клиенты», поскольку вы не можете создать регион на локаторе.

$ echo $GEODE_HOME
/Users/jblum/pivdev/apache-geode-1.6.0

$ gfsh
    _________________________     __
   / _____/ ______/ ______/ /____/ /
  / /  __/ /___  /_____  / _____  / 
 / /__/ / ____/  _____/ / /    / /  
/______/_/      /______/_/    /_/    1.6.0

Monitor and Manage Apache Geode

gfsh>start locator --name=LocaorOne --log-level=config
Starting a Geode Locator in /Users/jblum/pivdev/lab/LocaorOne...
....
Locator in /Users/jblum/pivdev/lab/LocaorOne on 10.0.0.121[10334] as LocaorOne is currently online.
Process ID: 41758
Uptime: 5 seconds
Geode Version: 1.6.0
Java Version: 1.8.0_152
Log File: /Users/jblum/pivdev/lab/LocaorOne/LocaorOne.log
JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.log-level=config -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /Users/jblum/pivdev/apache-geode-1.6.0/lib/geode-core-1.6.0.jar:/Users/jblum/pivdev/apache-geode-1.6.0/lib/geode-dependencies.jar

Successfully connected to: JMX Manager [host=10.0.0.121, port=1099]

Cluster configuration service is up and running.

gfsh>start server --name=ServerOne --log-level=config
Starting a Geode Server in /Users/jblum/pivdev/lab/ServerOne...
...
Server in /Users/jblum/pivdev/lab/ServerOne on 10.0.0.121[40404] as ServerOne is currently online.
Process ID: 41785
Uptime: 3 seconds
Geode Version: 1.6.0
Java Version: 1.8.0_152
Log File: /Users/jblum/pivdev/lab/ServerOne/ServerOne.log
JVM Arguments: -Dgemfire.default.locators=10.0.0.121[10334] -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true -Dgemfire.log-level=config -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /Users/jblum/pivdev/apache-geode-1.6.0/lib/geode-core-1.6.0.jar:/Users/jblum/pivdev/apache-geode-1.6.0/lib/geode-dependencies.jar

gfsh>list members
  Name    | Id
--------- | --------------------------------------------------------------
LocaorOne | 10.0.0.121(LocaorOne:41758:locator)<ec><v0>:1024 [Coordinator]
ServerOne | 10.0.0.121(ServerOne:41785)<v1>:1025

gfsh>list regions
No Regions Found

gfsh>create region --name=Customers --type=PARTITION --key-constraint=java.lang.Long --value-constraint=java.lang.Object
 Member   | Status
--------- | ------------------------------------------
ServerOne | Region "/Customers" created on "ServerOne"

gfsh>list regions
List of regions
---------------
Customers

gfsh>describe region --name=Customers
..........................................................
Name            : Customers
Data Policy     : partition
Hosting Members : ServerOne

Non-Default Attributes Shared By Hosting Members  

 Type  |    Name     | Value
------ | ----------- | ---------
Region | size        | 0
       | data-policy | PARTITION

Теперь, даже если я снова запустил приложение Spring Boot, оно все равно не сработает с тем же исключением ...

Caused by: org.springframework.beans.factory.BeanInitializationException: Region [Customers] in Cache [GemFireCache[id = 989520513; isClosing = false; isShutDownAll = false; created = Thu Aug 02 14:09:25 PDT 2018; server = false; copyOnRead = false; lockLease = 120; lockTimeout = 60]] not found
    at org.springframework.data.gemfire.ResolvableRegionFactoryBean.createRegion(ResolvableRegionFactoryBean.java:146) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    at org.springframework.data.gemfire.ResolvableRegionFactoryBean.afterPropertiesSet(ResolvableRegionFactoryBean.java:96) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    at org.springframework.data.gemfire.LookupRegionFactoryBean.afterPropertiesSet(LookupRegionFactoryBean.java:72) ~[spring-data-geode-2.1.0.RC1.jar:2.1.0.RC1]
    ...

Почему?

Это связано с тем, что 1) приложение Spring Boot, одноранговое приложение Apache Geode Cache не является частью кластера (пока) и 2) потому, что по умолчанию SDG не позволяет настроенному / загружаемому в Spring одноранговому приложению Apache Geode Cache получить свою конфигурацию из кластер (в частности, из Служба конфигурации кластера ), поэтому мы должны настроить / включить и то, и другое.

Мы можем подключить наше приложение Spring Boot, однорангового узла Apache Geode Cache к кластеру, указав атрибут locators аннотации @PeerCacheApplication как localhost[10334].

@PeerCacheApplication(name = "...", locators = "localhost[10334]")

Мы можем сделать так, чтобы наше приложение Spring Boot, одноранговое приложение Apache Geode Cache получало свою конфигурацию из кластера, включив свойство useClusterConfiguration, что мы делаем, добавляя следующее определение bean-компонента Configurer к нашему внутреннему статическому классу GeodeConfiguration следующим образом:

@Bean
PeerCacheConfigurer useClusterConfigurationConfigurer() {
  return (beanName, cacheFactoryBean) -> cacheFactoryBean.setUseClusterConfiguration(true);
}

Теперь, когда мы снова запускаем приложение Spring Boot, Apache Geode peer Cache, мы видим совсем другой результат. Сначала посмотрите, что наш одноранговый член (приложение) получает конфигурацию кластера ...

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cache xmlns="http://geode.apache.org/schema/cache" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" copy-on-read="false" is-server="false" lock-lease="120" lock-timeout="60" search-timeout="300" version="1.0" xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd">

<region name="Customers">
    <region-attributes data-policy="partition">
      <key-constraint>java.lang.Long</key-constraint>
      <value-constraint>java.lang.Object</value-constraint>
    </region-attributes>
  </region>
</cache>

Затем вы могли заметить, что я включил PDX, используя аннотацию SDG @EnablePdx. Это позволяет нам легко сериализовать типы объектов модели предметной области нашего приложения (например, Customer) без ненужной реализации нашего типа java.io.Serializable. Есть несколько причин, по которым вы все равно не захотите внедрять java.io.Serializable. Использование SDG @EnablePdx использует SDG MappingPdxSerializer < / a>, которая намного мощнее, чем собственная ReflectionBasedAutoSerializer Apache Geode / Pivotal GemFire.

В результате сериализации типов приложений (а именно Customer) вы увидите этот вывод ...

14:26:48.322 [main] INFO  org.apache.geode.internal.cache.PartitionedRegion - Partitioned Region /Customers is created with prId=2
Started ClusterConfiguredGeodeServerApplication in 4.223 seconds (JVM running for 5.574)
14:26:48.966 [main] INFO  org.apache.geode.pdx.internal.PeerTypeRegistration - Adding new type: PdxType[dsid=0, typenum=14762571
        name=example.app.spring.cluster_config.server.ClusterConfiguredGeodeServerApplication$Customer
        fields=[
        id:Object:identity:0:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=-1
        name:String:1:1:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=1]]
14:26:49.002 [main] INFO  org.apache.geode.pdx.internal.TypeRegistry - Caching PdxType[dsid=0, typenum=14762571
        name=example.app.spring.cluster_config.server.ClusterConfiguredGeodeServerApplication$Customer
        fields=[
        id:Object:identity:0:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=-1
        name:String:1:1:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=1]]

Еще одна причина, по которой я включаю PDX, заключается в том, что мне не нужно добавлять класс Customer к серверу (т.е. "ServerOne"), который начал использовать Gfsh. Это также позволяет мне запрашивать регион «Клиенты» и видеть, что Customer «Джон Доу» был успешно добавлен ...

gfsh>describe region --name=Customers
..........................................................
Name            : Customers
Data Policy     : partition
Hosting Members : ServerOne

Non-Default Attributes Shared By Hosting Members  

 Type  |    Name     | Value
------ | ----------- | ---------
Region | size        | 1
       | data-policy | PARTITION


gfsh>
gfsh>query --query="SELECT c.name FROM /Customers c"
Result : true
Limit  : 100
Rows   : 1

Result
-------
Jon Doe

Бинго! Успех!

Я не собираюсь даже начинать обсуждать все, что не так с вашей конфигурацией. Я умоляю вас прочитать документыРуководство пользователя Apache Geode (т. Е. Соответствующие разделы), ознакомьтесь с концепции см. в примерах, направляет, задает краткие вопросы и т. д. и т. д.

Вот пример исходного кода ...

https://github.com/jxblum/contacts-application/blob/master/configuration-example/src/main/java/example/app/spring/cluster_config/server/ClusterConfiguredGeodeServerApplication.java

Надеюсь это поможет!

-j

person John Blum    schedule 02.08.2018