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.x
和 spring-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 的 @EnableClusterConfiguration
(doc, Javadoc), or alternatively and preferably, SBDG's @EnableClusterAware
annotation (doc, Javadoc;即 meta-annotated 与 SDG 的 @EnableClusterConfiguation
)从客户端推送集群配置,此功能仅将 Region 和 Index 配置推送到集群,而不是过期策略。
参见 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 以使其更清楚。
在 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.x
和 spring-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 的 @EnableClusterConfiguration
(doc, Javadoc), or alternatively and preferably, SBDG's @EnableClusterAware
annotation (doc, Javadoc;即 meta-annotated 与 SDG 的 @EnableClusterConfiguation
)从客户端推送集群配置,此功能仅将 Region 和 Index 配置推送到集群,而不是过期策略。
参见 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 以使其更清楚。