【问题标题】:Java Config for Spring Gemfire xmlSpring Gemfire xml 的 Java 配置
【发布时间】:2016-07-18 08:25:59
【问题描述】:

我已将我的 Gemfire 的“client-cache.xml”定义如下:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:gfe="http://www.springframework.org/schema/gemfire"
   xsi:schemaLocation="http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
                       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <gfe:pool id="client" subscription-enabled="true">
    <gfe:locator host="localhost" port="41114"/>
    </gfe:pool>

    <gfe:client-cache pool-name="client"/>

    <gfe:client-region id="dataRegion" name="dataRegion" pool-name="client" shortcut="PROXY"/>

</beans>

我想为其创建相应的 Java 配置。

我尝试了以下配置:

@Resource
private Cache gemfireCache;

@Resource
private Pool client;

@Bean
public PoolFactoryBean client() {
    PoolFactoryBean client = new PoolFactoryBean();
    client.setSubscriptionEnabled(true);
    client.addLocators(new ConnectionEndpoint("localhost", 41114));
    return client;
}

@Bean
public ClientRegionFactoryBean<String, AbstractContent> dataRegion() {
    ClientRegionFactoryBean<String, AbstractContent> dataRegionFactory = new ClientRegionFactoryBean<>();
    dataRegionFactory.setPoolName("client");
    dataRegionFactory.setName("dataRegion");
    dataRegionFactory.setShortcut(ClientRegionShortcut.PROXY);
    return dataRegionFactory;
}

@Bean
public ClientCacheFactoryBean gemfireCache() {
    ClientCacheFactoryBean clientCacheFactory = new ClientCacheFactoryBean();
    clientCacheFactory.setPoolName("client");
    clientCacheFactory.setPdxSerializer(mappingPdxSerializer());
    return clientCacheFactory;
}

@Bean
public PlatformTransactionManager gemfireTransactionManager() throws Exception {
    return new GemfireTransactionManager(gemfireCache);
}

但是,我一直遇到异常说:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.gemstone.gemfire.cache.client.ClientCache] is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:372)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:369)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
at org.springframework.data.gemfire.client.PoolFactoryBean.eagerlyInitializeClientCacheIfNotPresent(PoolFactoryBean.java:218)
at org.springframework.data.gemfire.client.PoolFactoryBean.getObject(PoolFactoryBean.java:171)
at org.springframework.data.gemfire.client.PoolFactoryBean.getObject(PoolFactoryBean.java:65)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1590)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:317)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)

上面的 XML 不能转换成基于 Java 的配置吗?

任何帮助将不胜感激。 谢谢。

===============根据 John 的 cmets 在下方编辑==============

@约翰,

我尝试了@sample test case for gemfire client 提到的示例,并且该示例运行良好。 我正在使用定位器,该示例与定位器配置一起工作得很好 gemfirePool.setLocators(Collections.singletonList(new InetSocketAddress(host, port)))。 但是,根据 Pivotal 支持的建议,我正在使用 spring-data-gemfire 版本 1.8.2.RELEASE。 所以,我

  • 将spring-data-gemfire版本升级到1.8.2.RELEASE@pom.xml
  • 修复了编译错误
    (评论gemfireCache.setLazyInitialize(true)),
  • 并将gemfirePool.setLocators(Collections.singletonList(new InetSocketAddress(locatorHost, locatorPort)))更改为gemfirePool.addLocators(Collections.singletonList(new ConnectionEndpoint(locatorHost, locatorPort)))

测试用例被折腾了。

测试用例开始给我以下异常:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:228)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:230)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:249)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gemfireCache' defined in io.pivotal.gemfire.cache.client.SpringGemFireClientCacheTest$SpringGemFireClientConfiguration: Unsatisfied dependency expressed through constructor argument with index 1 of type [com.gemstone.gemfire.cache.client.Pool]: : Error creating bean with name 'gemfirePool': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.gemstone.gemfire.cache.client.ClientCache] is defined; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gemfirePool': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.gemstone.gemfire.cache.client.ClientCache] is defined
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
    ... 25 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gemfirePool': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.gemstone.gemfire.cache.client.ClientCache] is defined
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1585)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    ... 43 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.gemstone.gemfire.cache.client.ClientCache] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:372)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
    at org.springframework.data.gemfire.client.PoolFactoryBean.eagerlyInitializeClientCacheIfNotPresent(PoolFactoryBean.java:218)
    at org.springframework.data.gemfire.client.PoolFactoryBean.getObject(PoolFactoryBean.java:171)
    at org.springframework.data.gemfire.client.PoolFactoryBean.getObject(PoolFactoryBean.java:65)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
    ... 52 more

看来,这是 spring-data-gemfire 1.8.2.RELEASE 的问题。 我不确定我是否应该简单地恢复到 1.6.2.RELEASE 以及恢复到以前的版本会失去什么。

我创建了另一个示例 Spring Boot 应用程序:

  • pom.xml

    http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.cdk.test TestGemfireLocators 0.0.1-快照

    <parent>
        <groupId>io.spring.platform</groupId>
        <artifactId>platform-bom</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-gemfire</artifactId>
            <version>1.8.2.RELEASE</version>
        </dependency>
    
    </dependencies>
    

  • Application.java

    @SpringBootApplication 公共类应用程序{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @Bean(name = "region")
    public ClientRegionFactoryBean region(ClientCache gemfireCache, Pool gemfirePool) {
        ClientRegionFactoryBean versionedRegion = new ClientRegionFactoryBean();
        versionedRegion.setName("region");
        versionedRegion.setCache(gemfireCache);
        versionedRegion.setPool(gemfirePool);
        versionedRegion.setShortcut(ClientRegionShortcut.PROXY);
        return versionedRegion;
    }
    
    @Bean
    public ClientCacheFactoryBean gemfireCache(@Qualifier("gemfireProperties") Properties gemfireProperties,
            Pool gemfirePool) {
        ClientCacheFactoryBean gemfireCache = new ClientCacheFactoryBean();
        gemfireCache.setPool(gemfirePool);
        gemfireCache.setProperties(gemfireProperties);
        return gemfireCache;
    }
    
    @Bean(name = GemfireConstants.DEFAULT_GEMFIRE_POOL_NAME)
    public PoolFactoryBean gemfirePool(@Value("${locator.host}") String host, @Value("${locator.port}") int port) {
        PoolFactoryBean gemfirePool = new PoolFactoryBean();
        gemfirePool.setName(GemfireConstants.DEFAULT_GEMFIRE_POOL_NAME);
        gemfirePool.setSubscriptionEnabled(true);
        gemfirePool.addLocators(new ConnectionEndpoint(host, port));
        return gemfirePool;
    }
    
    @Bean
    public Properties gemfireProperties(@Value("${gemfire.log.level:config}") String logLevel) {
        Properties gemfireProperties = new Properties();
        gemfireProperties.setProperty("log-level", logLevel);
        return gemfireProperties;
    }
    

    }

上面的代码也不起作用并返回相同的异常。我用io.spring.platform (1.7.4.RELEASE) 中包含的默认版本的“spring-data-gemfire”尝试了上面的代码,结果仍然相同。

-------------POST John 的 cmets 和参考程序--------

非常感谢约翰。您提供的示例对我有所帮助,但是,我必须对代码进行一些更改。下面是我的最终项目的样子(如果你注意到,我正在注入 GemfireCache 而不是 ClientCache):

  • pom.xml

    http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.cdk.test TestGemfireLocators 0.0.1-快照

    <parent>
        <groupId>io.spring.platform</groupId>
        <artifactId>platform-bom</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-gemfire</artifactId>
            <version>1.8.2.RELEASE</version>
        </dependency>
    
    </dependencies>
    

  • Application.java

    @SpringBootApplication 公共类应用程序{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @Resource(name = "myRegion")
    private Region<String, Object> myRegion;
    
    int intValue(Long value) {
        return value.intValue();
    }
    
    String logLevel() {
        return System.getProperty("gemfire.log-level", "config");
    }
    
    Properties gemfireProperties() {
        Properties gemfireProperties = new Properties();
        gemfireProperties.setProperty("log-level", logLevel());
        return gemfireProperties;
    }
    
    @Bean
    ClientCacheFactoryBean gemfireCache() {
        ClientCacheFactoryBean gemfireCache = new ClientCacheFactoryBean();
    
        gemfireCache.setClose(true);
        gemfireCache.setProperties(gemfireProperties());
    
        return gemfireCache;
    }
    
    @Bean(name = GemfireConstants.DEFAULT_GEMFIRE_POOL_NAME)
    PoolFactoryBean gemfirePool(@Value("${locator.host}") String host, @Value("${locator.port}") int port) {
    
        PoolFactoryBean gemfirePool = new PoolFactoryBean();
    
        gemfirePool.setKeepAlive(false);
        gemfirePool.setSubscriptionEnabled(true);
        gemfirePool.setThreadLocalConnections(false);
    
        gemfirePool.addLocators(new ConnectionEndpoint(host, port));
    
        return gemfirePool;
    }
    
    @Bean(name = "myRegion")
    ClientRegionFactoryBean<String, Object> myRegion(@Value("${region.name}") String regionName, GemFireCache gemfireCache,
            Pool gemfirePool) {
        ClientRegionFactoryBean<String, Object> myRegion = new ClientRegionFactoryBean<>();
    
        myRegion.setCache(gemfireCache);
        myRegion.setName(regionName);
        myRegion.setPool(gemfirePool);
        myRegion.setShortcut(ClientRegionShortcut.PROXY);
    
        return myRegion;
    }
    
    @Bean
    PlatformTransactionManager gemfireTransactionManager(GemFireCache gemfireCache) {
        return new GemfireTransactionManager((Cache) gemfireCache);
    }
    

    }

【问题讨论】:

  • > “这是 spring-data-gemfire 1.8.2.RELEASE 的问题”...不太可能!仅供参考,我刚刚更新了 pivotal-gemfire-clientsever-examples 项目以使用 Spring Data GemFire 1.8.2.RELEASE 和 Spring Boot 1.4.0.RC1 并且所有工作都按预期工作。具体来说,我运行了 spring-gemfire-clientserver 示例(展示了基于 Java 的配置),它与 GemFire 8.2.0、SDG 1.8.2.RELEASE 和 Spring Boot 1.4.0.RC1 一起使用。接下来,我将玩弄你上面的配置,看看发生了什么。敬请期待……
  • 好吧,跟进...我采用了您的示例 Spring(客户端)配置,几乎完全按照原样(只有很小的、无关紧要的修改)并使用 Spring Boot GemFire Server 应用程序编写了一个示例测试和 GemFire 缓存客户端应用程序测试类。您可以在此处查看完整代码 (github.com/jxblum/spring-gemfire-tests/tree/master/src/test/…)。您甚至可以在运行后从 Gfsh 连接到基于 Spring Boot 的 GemFire 服务器并监控那里的内容。该测试按预期工作!
  • 谢谢约翰!会试一试,希望它会奏效。会及时通知您。
  • 谢谢约翰。我能够启动我的项目。我已经发布了我的配置。
  • 太棒了!真高兴你做到了。干杯!

标签: spring-data spring-java-config gemfire spring-data-gemfire


【解决方案1】:

NoSuchBeanDefinitionException 与您的应用程序 Java 配置类中注入的 Cache 引用有关...

@Resource
private Cache gemfireCache

注意:您可能更喜欢使用 @InjectSpring 的 @Autowired 注释,因为这在技术上更准确。

这里的问题是在您的 Spring Java 配置中没有定义类型为“Cache”的 Spring bean。

如果您在 ClientCacheFactoryBeangetObjectType() 方法上更仔细地 lookSpring 使用该方法在“按类型”自动装配应用程序组件期间检查 bean(定义),您会看到它返回ClientCache.class。从技术上讲,ClientCacheFactoryBean.getObjectType() 还返回实际缓存对象的类型,但我不记得 Spring 何时检查可用的 bean 定义以解决类型依赖关系。另外,我认为 Spring 容器在解析过程中还维护了一个类型到 bean 的映射(也称为缓存)。后者相关的唯一原因是因为 GemFire 只有 1 个实现 CacheClientCache,而那个实现,即 GemFireCacheImpl 实现了这两个接口。所以,它看起来应该是可以解决的,但是......

无论如何,所有这些都是为了更清楚地解释异常。

很遗憾,您不能使用...

return new GemfireTransactionManager(gemfireCache());

由于gemfireCache() bean 定义“方法”返回ClientCacheFactoryBean 的实例,而GemfireTransactionManager 构造函数需要Cache 的实例。

但是,您可以根据 SDG FactoryBeans 的需要定义 CacheClientCacheGemFireCache 类型的参数。例如,您的 gemfireTransactionManager bean 可以定义为...

@Bean
public PlatformTransactionManager gemfireTransactionManager(GemFireCache gemfireCache) {
  return new GemfireTransactionManager((Cache) gemfireCache));
}

注意:ClientCache 扩展了 GemFireCache

同样,您的 Region bean 定义“dataRegion”也期望并可以像这样获取缓存实例...

@Bean
public ClientRegionFactoryBean<String, AbstractContent> dataRegion(ClientCache gemfireCache, Pool gemfirePool) {
  ...
  dataRegion.setCache(gemfireCache);
  dataRegion.setPool(gemfirePool);
  ...
}

另外请注意,我可以将 Region 用于对集群服务器进行数据访问操作的 GemFire 池的引用传递。

Spring 将 Java 配置 @Bean 定义方法参数视为“类型依赖项”,因此您可以定义相关 bean 组件所需的预期结果 bean 类型(例如,“gemfireTransactionManager”需要“缓存”bean 依赖项)。

一般来说,从 XML 切换到 Java 配置没有问题。事实上,我鼓励它,甚至在我的示例中越来越多地使用 Java 配置(对于instance)。我计划及时将大部分 spring-gemfire-examples 转换为使用 Spring Boot 和 Java 配置。

说到spring-gemfire-examples,还有一个example with Java config。但是,我认为这个例子演示了对等缓存。因此,您可能会发现 3 中的示例更有帮助,因为我使用 XML 和 Java 比较了 GemFire 原生配置和 Spring 配置。

例如,我的 ClientCache Java 配置示例同时具有 GemFire Cache server Java configclient Java config

无论如何,希望这会有所帮助,如果您有更多问题,请随时与我们联系。

干杯, 约翰

更新 - 2016-07-19

使用您的 GemFire 缓存客户端来解决此问题的示例(和测试),Spring Java 配置提供了here

【讨论】:

  • 谢谢约翰!我会试一试,然后告诉你。
【解决方案2】:

尝试使用bean方法而不是@Resource,例如

return new GemfireTransactionManager(gemfireCache());

【讨论】:

    【解决方案3】:

    使用 Geode 运行 spring boot 测试时出现了这样的启动错误(路径已编辑):

    Invalid bean definition with name 'gemfireCache' defined in class path resource... CacheServerConfiguration... There is already... ClientCacheConfiguration... defined in class path resource... bound

    已通过添加修复 spring.main.allow-bean-definition-overriding=true 到我的application.properties 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-24
      • 2023-03-21
      • 2017-06-21
      • 2016-10-24
      • 2012-10-19
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多