package org.zstack.core.gc; import org.zstack.header.errorcode.ErrorCode; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; /** * Created by xing5 on 2017/3/4. */ public abstract class TimeBasedGarbageCollector extends GarbageCollector { @GC public volatile Long NEXT_TIME; @GC public volatile TimeUnit NEXT_TIME_UNIT; private TimerTask currentTimer; public TimeBasedGarbageCollector() { canceller = () -> {}; } private void setupTimer() { logger.debug(String.format("[GC] schedule a GC job[name:%s, id:%s] to run after %s %s", NAME, uuid, NEXT_TIME, NEXT_TIME_UNIT)); currentTimer = new TimerTask() { @Override public void run() { runTrigger(); } }; new Timer().schedule(currentTimer, NEXT_TIME_UNIT.toMillis(NEXT_TIME)); } @Override protected void cancel() { if (currentTimer != null) { currentTimer.cancel(); } super.cancel(); } @Override protected void fail(ErrorCode err) { super.fail(err); setupTimer(); } public void load(GarbageCollectorVO vo) { loadFromVO(vo); setupTimer(); } public final void submit(Long next, TimeUnit unit) { NEXT_TIME_UNIT = unit; NEXT_TIME = next; saveToDb(); setupTimer(); gcMgr.registerGC(this); } }