Невозможно подключиться к локатору через 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, что и CacheServer (и Manager), необходимо также включить @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