Мне нужно использовать политику с истекшим сроком действия с использованием времени последнего доступа, но не более максимального времени жизни.Но AccessedExpiryPolicy использует наибольшее из каждого времени.Т.е.:
Часть моей конфигурации:
<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
}
Я хочу, чтобы прошло последнее условие теста, но я получаю сообщение об ошибке.
Как это реализовать?