无法通过GFSH连接到定位器

时间:2019-01-04 12:47:43

标签: spring-boot gemfile spring-data-gemfire geode gfsh

我已经通过 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。

1 个答案:

答案 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中声明gemfirePropertiesgemfireCache 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