有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Hazelcast中实现用于单元测试的自定义时钟?

在使用自定义过期时间测试我的一些代码时,我需要在Hazelcast实例中设置时钟时间,这与在咖啡因缓存中使用自定义计时器设置时间非常相似

我发现这里没有任何文档,也没有任何问题


共 (1) 个答案

  1. # 1 楼答案

    跟踪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();
            }
        }
    }