无法通过 GFSH 连接到定位器

Unable to connect to Locator via 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 按照 John 的建议,我启用了管理器,但仍然无法连接。

您无法连接到 Locator(使用 Gfsh),因为您没有 Locator(服务,独立或嵌入式)运行 只是上面显示的 Spring (Java) 配置。

请注意,@CacheServerApplication(locators = "localhost[10334]") 注释,特别是您在上面配置的 locators 属性,不会启动嵌入式 Locator。它只是允许这个 Spring Boot 配置和引导的 Apache Geode 或 Pivotal GemFire 对等 Cache 节点加入一个现有的分布式系统(集群) "existing" Locator 运行 在 localhost 上,侦听端口 10334.

例如,您可以使用 Gfsh(例如 start locator --name=X ...)启动 Locator,然后启动您的 Spring 使用上面显示的 Spring (Java) 配置启动 应用程序,您会看到 Spring Boot app作为集群的一部分由Gfsh启动Locator.

配置和启动 "embedded" 定位器只是一个快捷方式(方便),但是要这样做,您需要使用 @EnableLocator 注释。

因此,要在与CacheServer(和Manager),你还必须包括@EnableLocator注解,像这样:

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

  ...
}

我有很多这样的例子here, for instance here, and talk about this generally here,等等

附带说明一下,您的整个配置 (class) 很混乱,很明显您不太明白自己在做什么。例如,在 JavaConfig 中声明 gemfirePropertiesgemfireCache beans 是多余且不必要的,因为您正在使用 @CacheServerApplication 注释。您的整个配置可以简化为:

@CacheServerApplication( 姓名="SpringDataGemFireApplication", 定位器 = "localhost[10334]", 日志级别 = "info" ) @EnableLocator @EnableManager(开始=真) @EnableGemfireRepositories(basePackages= "com.gemfire.demo") @组件扫描 public class 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) 首先,我会非常小心地使用 class 路径组件扫描 (@ComponentScan)。我不喜欢这种配置方法,尤其是在应该明确的生产环境中。

2) 我鼓励您考虑在 @EnableGemFireRepositorities 注释上使用类型安全的 basePackageClasses 属性而不是 basePackages 属性。使用 basePackageClasses,您只需引用所需包中的单个 interface/class(例如 com.gemfire.demo),而不是每个 interface/class。引用的 interface/class 用作标识要扫描的包的指针,包括所有子包。它是类型安全的,当您重新定位该包中的 interfaces/classes 时,您的属性在重构后仍然有效。

总之...

希望这对您有所帮助。

-j