package org.infosec.ismp.manager.agent.servicecheck; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.PostConstruct; import org.infosec.ismp.manager.ComponentLocator; import org.infosec.ismp.manager.domains.DomainComponent; import org.infosec.ismp.manager.domains.DomainLocator; import org.infosec.ismp.manager.model.ServiceCheckNodeEntity; import org.infosec.ismp.manager.model.ServiceCheckNodeParamEntity; import org.infosec.ismp.manager.model.ServiceCheckResultEntity; import org.infosec.ismp.util.ThreadCategory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.Assert; /** * 服务检测Locator * @author jiel * */ @Component public class ServiceCheckLocator implements ComponentLocator { /** * nodeid<->domain */ private Map<String, DomainComponent> nodeidMaps = new HashMap<String, DomainComponent>(); private DomainLocator m_domainLocator; private ServiceCheckNodeEntityService m_serviceCheckNodeService; @Autowired(required = true) public void setServiceCheckNodeService( ServiceCheckNodeEntityService serviceCheckNodeService) { m_serviceCheckNodeService = serviceCheckNodeService; } @Autowired(required = true) public void setDomainLocator(DomainLocator domainLocator) { m_domainLocator = domainLocator; } @PostConstruct public void init() { System.out.println("ServiceCheck Locator 开始初始化"); Assert.state(m_domainLocator != null, "m_domainLocator不能为空,请检查"); distruteAllServiceCheckNode(); } /** * 初始化ServiceCheckNode任务 */ public void distruteAllServiceCheckNode() { List<ServiceCheckNodeEntity> entities = getAllServiceCheckNode(); for (ServiceCheckNodeEntity entity : entities) { String domain = entity.getDomain(); Map<String,String> parameters = new HashMap<String,String>(); List<ServiceCheckNodeParamEntity> paramList = entity.getParam(); if(paramList!=null){ for (ServiceCheckNodeParamEntity serviceCheckNodeParamEntity : paramList) { parameters.put(serviceCheckNodeParamEntity.getParmName(), serviceCheckNodeParamEntity.getValue()); } } addServiceCheckNodeToDomain(domain, entity.getNodeid(),entity.getServiceType(), entity.getIpAddr(), entity.getInterval(),parameters); } } /** * 从DB中获取所有ServiceCheckNode任务entity * @return */ public List<ServiceCheckNodeEntity> getAllServiceCheckNode() { return m_serviceCheckNodeService.getAll(); } /** * 添加一个ServiceCheckNode任务 * @param domain * @param nodeid * @param serviceType * @param ipAddr * @param interval * @param parameters */ public void addServiceCheckNode(String domain,String nodeid,String serviceType,String ipAddr,long interval,Map<String,String> parameters){ serviceType=serviceType.toLowerCase(); addServiceCheckNodeToDb(domain,nodeid,serviceType,ipAddr, interval,parameters); addServiceCheckNodeToDomain(domain,nodeid,serviceType,ipAddr, interval,parameters); } /** * 删除一个ServiceCheckNode任务 * @param nodeid */ public void removeServiceCheckNode(String nodeid){ removeServiceCheckNodeFromDb(nodeid); removeServiceCheckNodeFromDomain(nodeid); nodeidMaps.remove(nodeid); } /** * 将ServiceCheckNode任务添加到domainComponent * @param domain * @param nodeid * @param serviceType * @param ipAddr * @param interval * @param parameters */ private void addServiceCheckNodeToDomain(String domain,String nodeid,String serviceType,String ipAddr,long interval,Map<String,String> parameters) { DomainComponent domainComp = m_domainLocator .createDomainIfNessary(domain); nodeidMaps.put(nodeid, domainComp); ServiceCheckNode node = createServiceCheckNode(nodeid,serviceType, ipAddr, interval,parameters); domainComp.addServiceCheckNode(node); } /** * 将ServiceCheckNode任务添加到Db * @param domain * @param nodeid * @param serviceType * @param ipAddr * @param interval * @param parameters */ private void addServiceCheckNodeToDb(String domain,String nodeid,String serviceType,String ipAddr,long interval,Map<String,String> parameters){ ServiceCheckNodeEntity entity = createServiceCheckNodeEntity(domain, nodeid, serviceType, ipAddr, interval, parameters); m_serviceCheckNodeService.addServiceCheckNode(entity); } /** * 根据nodeid从domainComponent中删除一个ServiceCheckNode任务 * @param nodeid */ private void removeServiceCheckNodeFromDomain(String nodeid){ DomainComponent domainComp =nodeidMaps.get(nodeid); if (domainComp != null) { domainComp.removeServiceCheckNode(nodeid); domainComp.RemoveServiceCheckResult(nodeid); } else { if (log().isDebugEnabled()) { log().debug("removeServiceCheckNode没有找到该nodeId:" + nodeid + "对应的域 "); } } } /** * 根据nodeid从DB中删除一个ServiceCheckNode任务 * @param nodeid */ private void removeServiceCheckNodeFromDb(String nodeid){ m_serviceCheckNodeService.removeServiceCheckNode(nodeid); } /** * 创建一个ServiceCheckNode * @param nodeid * @param serviceType * @param ipAddr * @param interval * @param parameters * @return */ private ServiceCheckNode createServiceCheckNode(String nodeid,String serviceType,String ipAddr,long interval,Map<String,String> parameters){ ServiceCheckNode node = new ServiceCheckNode(); node.setNodeid(nodeid); node.setIpAddr(ipAddr); node.setInterval(interval); node.setServiceType(serviceType); node.setParamMap(parameters); return node; } /** * 创建一个ServiceCheckNodeEntity * @param domain * @param nodeid * @param serviceType * @param ipAddr * @param interval * @param parameters * @return */ private ServiceCheckNodeEntity createServiceCheckNodeEntity(String domain,String nodeid,String serviceType,String ipAddr,long interval,Map<String,String> parameters){ ServiceCheckNodeEntity entity = new ServiceCheckNodeEntity(); entity.setDomain(domain); entity.setNodeid(nodeid); entity.setIpAddr(ipAddr); entity.setInterval(interval); entity.setServiceType(serviceType); List<ServiceCheckNodeParamEntity> paramList = entity.getParam(); Set<String> paramKey = parameters.keySet(); for (Iterator<String> iterator = paramKey.iterator(); iterator.hasNext();) { String key = iterator.next(); ServiceCheckNodeParamEntity paramEntity = new ServiceCheckNodeParamEntity(); paramEntity.setParmName(key); paramEntity.setValue(parameters.get(key)); paramList.add(paramEntity); } return entity; } ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } /** * 根据nodeid获取相应的域ID * @param nodeid * @return */ public String getDomainByNodeid(String nodeid) { DomainComponent domainComp =nodeidMaps.get(nodeid); if (domainComp != null) { return domainComp.getDomainId(); } else { if (log().isDebugEnabled()) { log().debug("ServiceCheckLocator.getDomainByNodeid没有找到该nodeId:" + nodeid + "对应的域 "); } return null; } } /** * 用于设置某个nodeid的状态 * @param nodeid * @param entity */ public void setServiceCheckResult(String nodeid, ServiceCheckResultEntity entity) { DomainComponent domainComp = nodeidMaps.get(nodeid); if (domainComp != null) { domainComp.putServiceCheckResult(nodeid,entity); } } /** * 获得某个nodeid的状态 * @param nodeid * @return */ public ServiceCheckResultEntity getServiceCheckResult(String nodeid){ DomainComponent domainComp = nodeidMaps.get(nodeid); if (domainComp != null) { return domainComp.getServiceCheckResult(nodeid); } return null; } }