我已经通过 Spring Boot 启动了GemFire服务器和定位器,当我尝试从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 按照约翰的建议,尽管我仍然无法连接,但我已启用Manager。
答案 0 :(得分:1)
您无法连接到 Locator (使用 Gfsh ),因为您没有 Locator (服务,两者都是独立的)或嵌入式)仅使用上面显示的 Spring (Java)配置运行。
请注意,@CacheServerApplication(locators = "localhost[10334]")
注释(特别是具有上面配置的locators
属性)不会启动嵌入式 Locator 。它仅允许配置并引导了该 Spring Boot 并启动了Apache Geode或Pivotal GemFire对等Cache
节点,即可使用“现有” Locator 来加入现有的分布式系统(集群)在localhost
上运行,在端口10334
上监听。
例如,您可以使用 Gfsh (例如start locator --name=X ...
)启动 Locator ,然后启动 Spring Boot 应用程序使用上面显示的 Spring (Java)配置,您会看到 Spring Boot 应用程序是 Gfsh 启动定位器。
这只是配置和启动“嵌入式”定位器的快捷方式(便利),但是要这样做,您需要使用@EnableLocator
批注。
因此,要在与 CacheServer (和相同)的 Spring Boot 应用程序中配置并启动(嵌入的) Locator 服务。 Manager ),您还必须添加@EnableLocator
批注,如下所示:
@SpringBootApplicaton
@CacheServerApplication
@EnableLocator
@EnableManager(start = true)
public class GemFireServerApplication {
...
}
我有很多关于here的示例,例如here,并讨论了一般的here等。
请注意,您的整个配置(类)很混乱,很显然您不太了解自己在做什么。例如,在JavaConfig中声明gemfireProperties
和gemfireCache
bean是多余且不必要的,因为您正在使用@CacheServerApplication
注释。您的整个配置可以简化为:
@CacheServerApplication( name =“ SpringDataGemFireApplication”, locators =“ localhost [10334]”, logLevel =“信息” ) @EnableLocator @EnableManager(开始= true) @EnableGemfireRepositories(basePackages =“ com.gemfire.demo”) @ComponentScan 公共类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)首先,我将非常注意使用类路径组件扫描(@ComponentScan
)。我不喜欢这种配置方法,尤其是在生产环境中应该明确的地方。
2)我鼓励您考虑在basePackageClasses
注释上使用类型安全的@EnableGemFireRepositorities
属性,而不要使用basePackages
属性。使用basePackageClasses
,您只需要引用所需包中的单个接口/类(例如com.gemfire.demo
),而不是每个接口/类。引用的接口/类用作标识要扫描的包(包括所有子包)的指针。这是类型安全的,当重新定位该包中的接口/类时,重构后您的属性仍然有效。
反正...
希望这会有所帮助。
-j