我需要使用过期策略和使用时间最后一次访问但没有更长的最大时间寿命。但是AccessedExpiryPolicy每次都使用最大的。IE:
我的部分配置:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="expiredAccessCache"/>
<property name="cacheMode" value="REPLICATED"/>
<property name="atomicityMode" value="TRANSACTIONAL"/>
<property name="writeSynchronizationMode" value="FULL_SYNC"/>
<property name="expiryPolicyFactory">
<bean class="com.stackoverflow.question53944630.MyExpiryPolicy" factory-method="factoryOf">
<constructor-arg>
<bean class="javax.cache.expiry.Duration">
<constructor-arg value="SECONDS"/>
<constructor-arg value="10"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="javax.cache.expiry.Duration">
<constructor-arg value="SECONDS"/>
<constructor-arg value="5"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>
MyExpiryPolicy.java
由上次访问时间和创建时间的不同策略组成:
package com.stackoverflow.question53944630;
import javax.cache.configuration.Factory;
import javax.cache.configuration.FactoryBuilder;
import javax.cache.expiry.Duration;
import javax.cache.expiry.ExpiryPolicy;
import java.io.Serializable;
import java.util.Objects;
public class MyExpiryPolicy implements ExpiryPolicy, Serializable {
private Duration expiryDurationAccess;
private Duration expiryDurationCreate;
public MyExpiryPolicy(Duration expiryDurationCreate, Duration expiryDurationAccess) {
this.expiryDurationCreate = expiryDurationCreate;
this.expiryDurationAccess = expiryDurationAccess;
}
public static Factory<ExpiryPolicy> factoryOf(Duration expiryDurationCreate, Duration expiryDurationAccess) {
return new FactoryBuilder.SingletonFactory<>(new MyExpiryPolicy(expiryDurationCreate, expiryDurationAccess));
}
@Override
public Duration getExpiryForCreation() {
return expiryDurationCreate;
}
@Override
public Duration getExpiryForAccess() {
return expiryDurationAccess;
}
@Override
public Duration getExpiryForUpdate() {
return null;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MyExpiryPolicy that = (MyExpiryPolicy) o;
return Objects.equals(expiryDurationAccess, that.expiryDurationAccess) &&
Objects.equals(expiryDurationCreate, that.expiryDurationCreate);
}
@Override
public int hashCode() {
return Objects.hash(expiryDurationAccess, expiryDurationCreate);
}
}
测试:
@Test
void testExpirePolicy() throws Exception {
IgniteCache<String, String> cache = ignite.cache("expiredAccessCache");
String key = "key";
String val = "value";
cache.put(key, val);
Thread.sleep(4000);
Assertions.assertNotNull(cache.get(key));
Thread.sleep(4000);
Assertions.assertNotNull(cache.get(key));
Thread.sleep(4000);
//12 seconds (>10 seconds in config) after creation and 4 (<5 seconds in configuration) after last access
Assertions.assertNull(cache.get(key)); //error, value is not null, but i need to get null
}
我希望通过最后一个测试条件,但我得到一个错误。
如何实施?