Невозможно подключиться к локатору через GFSH

Я запустил GemFire ​​Server и Locator через Spring Boot, и когда я пытаюсь подключиться к Locator из GFSH, у меня возникает следующая проблема:

gfsh> connect
Connecting to Locator at [host=localhost, port=10334] ..
Connection refused: connect

Ниже приведена конфигурация Spring (Java):

@Configuration 
@ComponentScan 
@EnableGemfireRepositories(basePackages= "com.gemfire.demo") 
@CacheServerApplication(locators = "localhost[10334]") 
@EnableManager 
public class GemfireConfiguration {

    @Bean
    Properties gemfireProperties() {
        Properties gemfireProperties = new Properties();
        gemfireProperties.setProperty("name", "SpringDataGemFireApplication");
        gemfireProperties.setProperty("mcast-port", "0");
        gemfireProperties.setProperty("log-level", "info");
        return gemfireProperties;
    }

    @Bean
    @Autowired
    CacheFactoryBean gemfireCache() {
        CacheFactoryBean gemfireCache = new CacheFactoryBean();
        gemfireCache.setClose(true);
        gemfireCache.setProperties(gemfireProperties());
        return gemfireCache;
    }

    @Bean(name="employee")
    @Autowired
    LocalRegionFactoryBean<String, Employee> getEmployee(final GemFireCache cache) {
        LocalRegionFactoryBean<String, Employee> employeeRegion = new LocalRegionFactoryBean<String, Employee>();
        employeeRegion.setCache(cache);
        employeeRegion.setClose(false);
        employeeRegion.setName("employee");
        employeeRegion.setPersistent(false);
        employeeRegion.setDataPolicy(DataPolicy.PRELOADED);
        return employeeRegion;
    }
}

Ссылка: Spring Data Gemfire locator согласно совету Джона, я включил Менеджер, хотя все еще не могу подключиться.

1 ответ

Решение

Вы не можете подключиться к Локатору (используя Gfsh), потому что у вас нет Локатора (сервиса, автономного или встроенного), работающего только с конфигурацией Spring (Java), показанной выше.

Обратите внимание, что @CacheServerApplication(locators = "localhost[10334]") аннотации, особенно с locators атрибут, как вы настроили выше, НЕ запускает встроенный локатор. Он просто позволяет этому Spring Boot сконфигурировать и загрузить Apache Geode или Pivotal GemFire.Cache узел для присоединения к существующей распределенной системе (кластеру) с запущенным "существующим" локаторомlocalhostслушаю по порту10334,

Например, вы могли бы запустить локатор с помощью Gfsh(например,start locator --name=X ...), затем запустили приложение Spring Boot с конфигурацией Spring (Java), показанной выше, и вы увидите приложение Spring Boot как часть кластера, образованного запущенным локатором Gfsh.

Это просто ярлык (удобство) для настройки и запуска "встроенного" локатора, но для этого вам нужно использовать @EnableLocator аннотаций.

Следовательно, для настройки и запуска (встроенной) службы локатора в том же приложении Spring Boot, что и CacheServerManager), необходимо также включить @EnableLocator аннотация, вот так:

@SpringBootApplicaton
@CacheServerApplication
@EnableLocator
@EnableManager(start = true)
public class GemFireServerApplication {

  ...
}

У меня есть множество примеров этого здесь, например здесь, и говорить об этом вообще здесь и т.д.

Как примечание: вся ваша конфигурация (класс) запутана, и становится ясно, что вы не совсем понимаете, что делаете. Например, объявив gemfireProperties а также gemfireCache bean-компоненты в JavaConfig избыточны и не нужны, так как вы используете @CacheServerApplication аннотаций. Вся ваша конфигурация может быть упрощена до:

@CacheServerApplication (name = "SpringDataGemFireApplication", locators = "localhost [10334]", logLevel = "info") @EnableLocator @EnableManager (start = true) @EnableGemfireRepositories (basePackages = "com.gemfire.demoSc @") GemfireConfiguration {

@Bean(name="employee")
LocalRegionFactoryBean<String, Employee> getEmployee(GemFireCache cache) {

    LocalRegionFactoryBean<String, Employee> employeeRegion = 
        new LocalRegionFactoryBean<String, Employee>();

    employeeRegion.setCache(cache);
    employeeRegion.setClose(false);
    employeeRegion.setName("employee");
    employeeRegion.setPersistent(false);
    employeeRegion.setDataPolicy(DataPolicy.PRELOADED);

    return employeeRegion;
}

}

Две вещи:

1) Во-первых, я был бы очень осторожен при использовании сканирования компонентов classpath (@ComponentScan). Я не фанат этого подхода к конфигурации, особенно в производстве, где все должно быть ясно.

2) Я бы посоветовал вам рассмотреть возможность использования безопасных типов basePackageClasses атрибут на @EnableGemFireRepositorities аннотация, а не basePackages приписывать. С basePackageClasses, вам нужно только сослаться на один интерфейс / класс в желаемом пакете (например, com.gemfire.demo) а не каждый интерфейс / класс. Упомянутый интерфейс / класс служит указателем для идентификации пакета для сканирования, включая все подпакеты. Это безопасно для типов, и когда ваши интерфейсы / классы в этом пакете переставляются, ваш атрибут остается действительным после рефакторинга.

Тем не мение...

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

-j

Другие вопросы по тегам