2017-07-19 61 views

回答

0

在跟踪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(); 
     } 
    } 
} 
相关问题