/** * Dianping.com Inc. * Copyright (c) 2003-2013 All Rights Reserved. */ package com.dianping.pigeon.remoting.provider.publish; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.config.ConfigManager; import com.dianping.pigeon.config.ConfigManagerLoader; import com.dianping.pigeon.log.LoggerLoader; import com.dianping.pigeon.remoting.ServiceFactory; public class ServiceOnlineTask implements Runnable { private static final Logger logger = LoggerLoader.getLogger(ServiceOnlineTask.class); private static ConfigManager configManager = ConfigManagerLoader.getConfigManager(); private static final int CHECK_INTERVAL = configManager.getIntValue("pigeon.online.task.interval", 1000); private static volatile boolean isServiceOnlineTaskStarted = false; private static ServiceOnlineTask serviceOnlineTask = null; private volatile boolean isStop = false; private int delay = configManager.getIntValue("pigeon.online.task.startdelay", CHECK_INTERVAL); public static void start() { start(-1); } public static void start(int delay) { boolean enableOnlineTask = ConfigManagerLoader.getConfigManager() .getBooleanValue("pigeon.online.task.enable", true); if (!isServiceOnlineTaskStarted && enableOnlineTask && ServicePublisher.isAutoPublish()) { serviceOnlineTask = new ServiceOnlineTask(delay); logger.info("Service online task is enabled"); Thread t = new Thread(serviceOnlineTask); t.setDaemon(true); t.setName("Pigeon-Service-Online-Task"); t.start(); isServiceOnlineTaskStarted = true; } else { logger.info("Service online task is disabled"); } } public static void stop() { if (serviceOnlineTask != null) { serviceOnlineTask.setStop(true); while (isServiceOnlineTaskStarted) { try { Thread.sleep(100); } catch (InterruptedException e) { } } serviceOnlineTask = null; } } public ServiceOnlineTask(int delay) { if (delay >= 0) { this.delay = delay; } } public boolean isStop() { return isStop; } public void setStop(boolean isStop) { this.isStop = isStop; } public void run() { logger.info("Service online task start"); try { Thread.sleep(delay); if (!isStop) { ServiceFactory.online(); } } catch (Throwable e) { logger.error(e.getMessage(), e); } logger.info("Service online task end, current weight:" + ServicePublisher.getServerWeight()); isServiceOnlineTaskStarted = false; } }