package org.quickbundle.project.init; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.quickbundle.config.RmClusterConfig; import org.quickbundle.config.RmConfig; import org.quickbundle.tools.context.RmBeanHelper; import org.quickbundle.tools.helper.RmDateHelper; import org.quickbundle.tools.helper.RmSqlHelper; public class NodeHeartbeatDaemon { private NodeHeartbeatDaemon() { } private static NodeHeartbeatDaemon singleton = new NodeHeartbeatDaemon(); public static NodeHeartbeatDaemon getSingleton() { return singleton; } /** * 刷新节点心跳 */ private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { final ThreadGroup group; final AtomicInteger threadNumber = new AtomicInteger(1); final String namePrefix; { SecurityManager s = System.getSecurityManager(); group = (s != null)? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "NodeHeartbeat"; } public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) { t.setDaemon(false); } if (t.getPriority() != Thread.NORM_PRIORITY) { t.setPriority(Thread.NORM_PRIORITY); } return t; } }); public void start() { executor.scheduleWithFixedDelay(new Runnable() { public void run() { if(RmConfig.getSingleton().getDatabaseProductName() != null) { String sql = "update RM_NODE_HEARTBEAT set VERSION=VERSION+1, LAST_HEARTBEAT=" + RmSqlHelper.getFunction(RmSqlHelper.Function.SYSDATE, RmConfig.getSingleton().getDatabaseProductName()) + " where ID=?"; RmBeanHelper.getCommonServiceInstance().doUpdate(sql, new Object[]{RmClusterConfig.getSingleton().getSelfId()}); } else { String sql = "update RM_NODE_HEARTBEAT set VERSION=VERSION+1, LAST_HEARTBEAT=? where ID=?"; RmBeanHelper.getCommonServiceInstance().doUpdate(sql, new Object[]{RmDateHelper.getSysTimestamp(), RmClusterConfig.getSingleton().getSelfId()}); } } }, 1000, RmConfig.getSingleton().getNodeHeartbeatInterval(), TimeUnit.MILLISECONDS); } public void shutdown() { executor.shutdown(); } }