当前位置: 首页 > 知识库问答 >
问题:

如何在不显式定义区域的情况下为spring缓存管理器配置gemfire?

隗和裕
2023-03-14
    @Bean
    public Region<Long,Person> myPersonRegion(LocalRegionFactoryBean<Long, Person> personRegion) throws Exception {

        return personRegion.getObject();


    }

    @Bean
    public LocalRegionFactoryBean<Long, Person> personRegion(GemFireCache cache,AsyncEventQueue gemfireQueue) {
        LocalRegionFactoryBean<Long, Person> personRegion = new LocalRegionFactoryBean<>();
        personRegion.setCache(cache);
        personRegion.setClose(false);
        personRegion.setName("person");
        personRegion.setAsyncEventQueues(new AsyncEventQueue[]{gemfireQueue});
        personRegion.setPersistent(false);
        return personRegion;

    }

共有1个答案

张晔
2023-03-14

简短的回答是否定的;不完全是。

我也不完全确定你下面的说法是否完全准确...

我们使用Guava(或Hazelcast,redis等)的经验是,我们不需要显式定义缓存。

但是,在所有关键的GemFire或Apache Geode测试示例中,您必须显式地创建将在Spring的缓存基础结构中充当“缓存”的区域。但是,SDG的GemfireCacheManager实现将动态创建Spring的AOPCacheInterceptor所需的SpringCacheInterceptor对象(由底层区域支持)。

这将产生以下最小的必要配置,以启用Gemfire/Geode作为提供程序的缓存。

@SpringBootApplication
@EnableCaching
class MyCachingApplication {

  public static void main(String[] args) {
    SpringApplication.run(MyCachingApplication.class, args);
  }

  @Bean
  GemfireCacheManager cacheManager(GemFireCache gemfireCache) {
    GemfireCacheManager cacheManager = new GemfireCacheManager();
    cacheManager.setCache(gemfireCache);
    return cacheManager;
  }

  // define all Region beans required by the application including Regions
  // used specifically in Spring's Cache Abstraction
}

现在,说了这些之后,我已经根据Spring Cache抽象注释(例如@cacheable)建立了动态区域创建原型,在声明的应用程序[service]组件中使用这些注释,从这个测试开始就可以看到这些注释。下面是配置。

正如您所看到的,GemFire区域没有明确的bean定义,它们将在Spring的缓存基础结构中充当缓存。然而,应用程序的(测试的)Spring@service组件确实使用了缓存。

动态区域创建是通过使用SpringBeanPostProcessor(这里)和GemFire函数(使用SDG的函数注释支持)在运行时和启动期间动态创建区域来实现的。这里定义了函数执行,这里定义了实际的函数实现。

这个示例非常粗糙(即不处理DataPolicy)之外的自定义区域配置(例如,驱逐/过期、持久化、溢出等),并且当前设置为处理对等缓存拓扑(即测试应用程序是GemFire DS中的对等成员/节点)。

但是,很容易将这个原型扩展到客户机/服务器拓扑中,考虑所有Spring和JSR-107缓存注释,并允许更多的自定义区域配置。

随着时间的推移,这可能是我添加到SDG框架本身的东西。

希望这能有所帮助。

 类似资料:
  • 我已经挣扎了几天了。我对Spring Boot还是个新手,喜欢不使用XML配置的想法。 我创建了一个RESTfull应用程序(使用JSON)。我正在按照本教程正确配置身份验证。 可以使用 元素上的entry-point-ref属性设置AuthenticationEntryPoint。 没有提到任何关于如何使用Java配置来实现它的内容。 那么如何在不使用XML的情况下“注册”自己的以防止在使用Fo

  • 我在我的web应用程序中使用Spring启动缓存支持,并将咖啡因设置为缓存提供程序。 我在我的项目中有几个缓存,其中大多数都有公共配置,但是对于两个特定的缓存,我需要设置不同的参数。 在我的中,我有类似的内容: 这是常见的缓存。然后我想使用自定义参数扩展此配置。 这篇文章解释了如何通过配置类配置缓存,但是使用这个方法我完全覆盖了常见的配置。 我需要的是这样的东西: 但是声明一个新的bean,“原始

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1

  • 我有一个Spring启动项目,它作为一个库(打包的jar文件)到其他一些项目。我试图哟配置咖啡因缓存,将异步刷新请求后,向服务。 pom.xml(包括): 我的配置类: DAO层(此处需要缓存): DAO层(这里也需要缓存): 运行此安装程序时,我遇到以下错误堆栈: 不确定设置中缺少什么?

  • 我使用下面的代码(来自这个答案)来配置要记录在WebClient请求上的头: 这很管用,但感觉有点奇怪。问题是:我是否需要像这样包含Jackson/objectMapper配置,或者是否有更简单的方法来避免Spring objectMapper配置被覆盖?

  • 我试图使用实体类和实体管理器将一条记录插入数据库(MySQL)。但是其中一个字段是自动递增的主键,所以除非我手动提供一个值,否则插入是不成功的。 如何解决这样的问题?是否有一种方法告诉实体管理器尝试不带ID字段的插入,而使用值。 更新:下面是定义的实体类的一部分