Spring Data Gemfire:TTL 到期注释不起作用;如何使用注释设置 TTL?

Spring Data Gemfire: TTL expiration annotation is not working; how to set TTL using annotations?

Gfsh 中,我能够做到:create region --name=employee --type=REPLICATE --enable-statistics=true --entry-time-to-live-expiration=900.

我们需要使用 Java 使用 @EnableEntityDefinedRegions 注释创建一个区域。当我在 Gfsh 中使用 describe 时,区域正在显示,但实体生存时间过期 (TTL) 未通过以下方式设置。

知道如何在 Java 中设置 TTL 吗?

Spring 启动 2.5.xspring-gemfire-starter 1.2.13.RELEASE 在应用程序中使用。

@EnableStatistics
@EnableExpiration(policies = {
        @EnableExpiration.ExpirationPolicy(regionNames = "Employee", timeout = 60, action = ExpirationActionType.DESTROY))
})
@EnableEntityDefinedRegions 
public class BaseApplication {
....

@Region("Employee")
public class Employee {

@EnableStatistics
@EnableExpiration
public class BaseApplication {
----

@Region("Employee")
@TimeToLiveExpiration(timeout = "60", action = "DESTROY")
@Expiration(timeout = "60", action = "DESTROY")
public class Employee {
....

使用 bean 创建方式也不起作用,出现错误“客户端缓存不支持操作”

@EnableEntityDefinedRegions
//@PeerCacheApplication  for peer cache Region is not creating PCC gemfire 
public class BaseApplication {
---
}
   
@Bean(name="employee")
PartitionedRegionFactoryBean<String, Employee> getEmployee
        (final GemFireCache cache,
         RegionAttributes<String, Employee> peopleRegionAttributes) {
    PartitionedRegionFactoryBean<String, Employee> getEmployee = new PartitionedRegionFactoryBean<String, Employee>();
    getEmployee.setCache(cache);
    getEmployee.setAttributes(peopleRegionAttributes);
    getEmployee.setCache(cache);
    getEmployee.setClose(false);
    getEmployee.setName("Employee");
    getEmployee.setPersistent(false);
    getEmployee.setDataPolicy( DataPolicy.PARTITION);
    getEmployee.setStatisticsEnabled( true );
    getEmployee.setEntryTimeToLive( new ExpirationAttributes(60) );
    return getEmployee;
}

@Bean
@SuppressWarnings("unchecked")
RegionAttributesFactoryBean EmployeeAttributes() {
    RegionAttributesFactoryBean EmployeeAttributes = new RegionAttributesFactoryBean();

    EmployeeAttributes.setKeyConstraint( String.class );
    EmployeeAttributes.setValueConstraint( Employee.class );

 }

首先,Spring Boot for Apache Geode (SBDG) 1.2.x 已经停产因为 Spring Boot 2.2.x 已停产(详见 support)。 SBDG 遵循 Spring Boot 的 支持生命周期和策略。

其次,SBDG1.2.x基于SpringBoot2.2.x。关于此事见Version Compatibility Matrix for further details. We will not support mismatched dependency versions. While mismatched dependency versions may work in certain cases (mileage varies depending on your use case), the version combinations not explicitly stated in the Version Compatibility Matrix will not be supported none-the-less. Also see the documentation

现在,关于 TTL Region 条目过期策略的问题...

SBDG auto-configuration 默认创建一个 Apache Geode ClientCache 实例(参见 docs)。您不能使用 ClientCache 实例创建 PARTITION Region

如果您的 Spring Boot 应用程序旨在成为 Apache Geode 中的 peer Cache 实例集群 (server-side),那么你必须通过 覆盖 SBDG 的 auto-configuration 来明确声明你的意图,如下所示:

@PeerCacheApplication
@SpringBootApplication
class MySpringBootApacheGeodePeerCacheApplication { 
    // ...
}

TIP: See the documentation on creating peer Cache applications using SBDG.

请记住,当您覆盖 SBDG 的 auto-configuration 时,您可能需要隐含地对 Apache Geode 配置的其他方面负责,例如安全! Heed the warning.

另一方面,如果您的意图是真正启用 Spring Boot/SBDG 应用程序作为缓存“客户端”(即 ClientCache 实例,默认值),那么TTL Region 条目过期策略在客户端 PROXY Regions 上没有意义,这是默认值 DataPolicy (EMPTY) 对于客户端 Regions 当使用 Apache Geode (SDG) @EnableEntityDefinedRegions 注释的 Spring 数据时(见Javadoc)。这是因为 Apache Geode 客户端 PROXY Regions 不在本地存储任何数据。所有数据访问操作都转发到server/cluster.

即使您更改配置以使用客户端 CACHING_PROXY Regions,TTL Region 过期策略也只会生效本地。您必须单独配置相应的 server/cluster Regions(例如使用 Gfsh)。

此外,即使您可以使用 SDG 的 @EnableClusterConfigurationdoc, Javadoc), or alternatively and preferably, SBDG's @EnableClusterAware annotation (doc, Javadoc;即 meta-annotated 与 SDG 的 @EnableClusterConfiguation)从客户端推送集群配置,此功能仅将 RegionIndex 配置推送到集群,而不是过期策略。

参见 SBDG documentation on expiration for further details. This doc also leads to SDG's documentation on expiration, and specifically Annotation-based expiration configuration

我看到 SBDG 文档在过期问题上不是很清楚,所以我在 SBDG 中提交了一份 Issue ticket 以使其更清楚。