package com.github.ltsopensource.admin.cluster; import com.github.ltsopensource.admin.access.domain.NodeOnOfflineLog; import com.github.ltsopensource.admin.request.NodePaginationReq; import com.github.ltsopensource.admin.response.PaginationRsp; import com.github.ltsopensource.core.cluster.Node; import com.github.ltsopensource.core.commons.utils.CollectionUtils; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; import com.github.ltsopensource.core.registry.*; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Robert HG (254963746@qq.com) on 6/5/15. */ public class BackendRegistrySrv { private static final Logger LOGGER = LoggerFactory.getLogger(BackendRegistrySrv.class); private BackendAppContext appContext; private Registry registry; private NotifyListener notifyListener; public BackendRegistrySrv(BackendAppContext appContext) { this.appContext = appContext; } private void subscribe() { if (registry instanceof AbstractRegistry) { ((AbstractRegistry) registry).setNode(appContext.getNode()); } registry.subscribe(appContext.getNode(), notifyListener); } public void reSubscribe() { // 取消订阅 registry.unsubscribe(appContext.getNode(), notifyListener); // 清空内存数据 appContext.getNodeMemCacheAccess().clear(); // 重新订阅 subscribe(); } public PaginationRsp<Node> getOnlineNodes(NodePaginationReq request) { return appContext.getNodeMemCacheAccess().pageSelect(request); } /** * 记录节点上下线日志 */ private void addLog(NotifyEvent event, List<Node> nodes) { List<NodeOnOfflineLog> logs = new ArrayList<NodeOnOfflineLog>(nodes.size()); for (Node node : nodes) { NodeOnOfflineLog log = new NodeOnOfflineLog(); log.setLogTime(new Date()); log.setEvent(event == NotifyEvent.ADD ? "ONLINE" : "OFFLINE"); log.setClusterName(node.getClusterName()); log.setCreateTime(node.getCreateTime()); log.setGroup(node.getGroup()); log.setHostName(node.getHostName()); log.setIdentity(node.getIdentity()); log.setIp(node.getIp()); log.setPort(node.getPort()); log.setThreads(node.getThreads()); log.setNodeType(node.getNodeType()); log.setHttpCmdPort(node.getHttpCmdPort()); logs.add(log); } appContext.getBackendNodeOnOfflineLogAccess().insert(logs); } public void start() throws Exception { registry = RegistryFactory.getRegistry(appContext); notifyListener = new NotifyListener() { @Override public void notify(NotifyEvent event, List<Node> nodes) { if (CollectionUtils.isEmpty(nodes)) { return; } switch (event) { case ADD: appContext.getNodeMemCacheAccess().addNode(nodes); LOGGER.info("ADD NODE " + nodes); break; case REMOVE: appContext.getNodeMemCacheAccess().removeNode(nodes); LOGGER.info("REMOVE NODE " + nodes); break; } // 记录日志 addLog(event, nodes); } }; subscribe(); } }