0

我需要使用过期策略和使用时间最后一次访问但没有更长的最大时间寿命。但是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
}

我希望通过最后一个测试条件,但我得到一个错误。

如何实施?

4

1 回答 1

0

使用您的设置,您需要在访问后超过 5 秒才能使值过期。你只等4。

于 2018-12-31T10:05:51.263 回答