1

我已经通过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 定位器 根据 John 的建议,我启用了 Manager,但我仍然无法连接。

4

1 回答 1

1

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

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

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

它只是配置和启动“嵌入式”定位器的快捷方式(方便),但要这样做,您需要使用@EnableLocator注释。

因此,要在与CacheServer(和Manager )相同的Spring Boot应用程序中配置和启动(嵌入式)Locator服务,您还必须包含注释,如下所示:@EnableLocator

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

  ...
}

我在这里有很多这样的例子,例如这里,一般来说这里等等。

作为旁注,您的整个配置(类)很混乱,很明显您不太了解自己在做什么。例如,在 JavaConfig 中声明gemfirePropertiesgemfireCachebean 是多余且不必要的,因为您使用的是@CacheServerApplication注解。您的整个配置可以简化为:

@CacheServerApplication(name = "SpringDataGemFireApplication", locators = "localhost[10334]", logLevel = "info") @EnableLocator @EnableManager(start = true) @EnableGemfireRepositories(basePackages= "com.gemfire.demo") @ComponentScan 公共类宝石火配置 {

@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

于 2019-01-04T21:57:18.573 回答