1
当我使用自定义过期时间测试一些代码时,我需要在Hazelcast实例中设置时钟时间,非常类似于如何使用咖啡因缓存中的自定义代码设置时间。如何在Hazelcast中实现自定义时钟以进行单元测试?
我发现这没有记录在任何地方,也没有任何问题。
当我使用自定义过期时间测试一些代码时,我需要在Hazelcast实例中设置时钟时间,非常类似于如何使用咖啡因缓存中的自定义代码设置时间。如何在Hazelcast中实现自定义时钟以进行单元测试?
我发现这没有记录在任何地方,也没有任何问题。
在跟踪HazelcastInstance
的源代码,自定义时钟可以,如果你设置系统属性来实现,com.hazelcast.clock.impl
这是Hazelcast如何加载它们的时钟
package com.hazelcast.util;
...
public final class Clock {
private static final ClockImpl CLOCK;
private Clock() {
}
/** Returns the current time in ms for the configured {@link ClockImpl} */
public static long currentTimeMillis() {
return CLOCK.currentTimeMillis();
}
static {
CLOCK = createClock();
}
static ClockImpl createClock() {
String clockImplClassName = System.getProperty(ClockProperties.HAZELCAST_CLOCK_IMPL);
if (clockImplClassName != null) {
try {
return ClassLoaderUtil.newInstance(null, clockImplClassName);
} catch (Exception e) {
throw rethrow(e);
}
}
String clockOffset = System.getProperty(ClockProperties.HAZELCAST_CLOCK_OFFSET);
long offset = 0L;
if (clockOffset != null) {
try {
offset = Long.parseLong(clockOffset);
} catch (NumberFormatException e) {
throw rethrow(e);
}
}
if (offset != 0L) {
return new SystemOffsetClock(offset);
}
return new SystemClock();
}
}
因此,设置此时钟,我们需要用我们自己的时钟设置系统属性,
public class MyHazelcastCacheTest {
static {
// set unit test time travelling clock
System.setProperty(ClockProperties.HAZELCAST_CLOCK_IMPL, TimeTravellingStaticClock.class.getName());
}
private void timeTravel(Clock clock) {
TimeTravellingStaticClock.timeTravel(clock);
}
private void undoTimeTravel() {
TimeTravellingStaticClock.undoTimeTravel();
}
private static class TimeTravellingStaticClock extends com.hazelcast.util.Clock.ClockImpl {
private static Clock sClock = Clock.systemUTC();
public TimeTravellingStaticClock() {
// nothing
}
public static void timeTravel(Clock clock) {
sClock = clock;
}
public static void undoTimeTravel() {
sClock = Clock.systemUTC();
}
@Override
protected long currentTimeMillis() {
return sClock.millis();
}
}
}