Apache Ignite.Срок действия политики с использованием времени последнего доступа, но не более максимального времени жизни - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужно использовать политику с истекшим сроком действия с использованием времени последнего доступа, но не более максимального времени жизни.Но 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
}

Я хочу, чтобы прошло последнее условие теста, но я получаю сообщение об ошибке.

Как это реализовать?

1 Ответ

0 голосов
/ 31 декабря 2018

С вашими настройками вам потребуется более 5 секунд, чтобы пройти после того, как доступ к значению истечет.Вы только ждете 4.

...