package org.infosec.ismp.servicecheck;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.infosec.ismp.daemon.AbstractServiceDaemon;
import org.infosec.ismp.model.poller.ServiceMonitor;
import org.infosec.ismp.util.ThreadCategory;
import org.infosec.ismp.util.scheduler.LegacyScheduler;
import org.infosec.ismp.util.scheduler.Schedule;
import org.infosec.ismp.util.scheduler.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class ServiceCheck extends AbstractServiceDaemon {
private final static String LOG4J_CATEGORY = "ISMP.ServiceCheck";
private Scheduler m_scheduler;// 调度器
private int m_threads = 10;
private Map<String,ServiceCheckService> serviceCheckMap = new HashMap<String,ServiceCheckService>();
private Map<String,ServiceMonitor> monitorMap = new HashMap<String,ServiceMonitor>();
private ServiceCheckMessageSend messageSend;
public ServiceCheckMessageSend getMessageSend() {
return messageSend;
}
@Autowired(required=true)
public void setMessageSend(ServiceCheckMessageSend messageSend) {
this.messageSend = messageSend;
}
public Scheduler getScheduler() {
return m_scheduler;
}
public void setScheduler(Scheduler scheduler) {
m_scheduler = scheduler;
}
public int getThreads() {
return m_threads;
}
public void setThreads(int threads) {
m_threads = threads;
}
public ServiceCheck() {
super(LOG4J_CATEGORY);
}
/**
* 添加一个服务
* @param nodeid
* @param serviceType
* @param parameters
*/
public void addServiceCheck(String nodeid,String serviceType,long interval,String ipAddr,Map parameters)
{
if (serviceCheckMap.containsKey(nodeid)) {
log().error("该nodeid:"+nodeid+"已存在!请重新输入!");
return;
}
if(null==serviceType&&"".equals(serviceType))
{
log().error("请输入该nodeid:"+nodeid+"中serviceType!请重新输入!");
return;
}
serviceType=serviceType.toLowerCase();
if(!monitorMap.containsKey(serviceType))
{
ServiceMonitor monitor=null;
try {
monitor = initMonitor(serviceType);
} catch (IOException e) {
log().warn("读取属性文件IO异常!nodeid:"+nodeid,e);
return;
} catch (ClassNotFoundException e) {
log().warn("该monitor服务不存在!nodeid:"+nodeid,e);
return;
} catch (InstantiationException e) {
log().warn("该monitor服务初始化错误!nodeid:"+nodeid,e);
return;
} catch (IllegalAccessException e) {
log().warn("该monitor服务不存在!nodeid:"+nodeid,e);
return;
}
if(null==monitor)
{
log().warn("资源配置文件中找不到该服务类型!nodeid:"+nodeid+"serviceType:"+serviceType);
return;
}
monitorMap.put(serviceType, monitor);
}
ServiceCheckModel model = new ServiceCheckModel();
model.setNodeid(nodeid);
model.setType(serviceType);
model.setMonitor((ServiceMonitor)monitorMap.get(serviceType));
ServiceCheckConfig config = new ServiceCheckConfig();
config.setInterval(interval);
model.setIpAddr(ipAddr);
//// System.out.println(parameters.get("ipAddr"));
// if(null!=parameters&¶meters.size()>0){
// if(null!=parameters.get("interval")){
// if(parameters.get("interval") instanceof Long){
// config.setInterval((Long)parameters.get("interval"));
// }
// }
// if(null!=parameters.get("ipAddr")&&!"".equals(parameters.get("ipAddr"))){
// model.setIpAddr(parameters.get("ipAddr").toString());
// }else
// {
// log().error("ServiceCheck类中addServiceCheck方法parameters中未输出ipAddr元素!nodeid:"+nodeid);
// return ;
// }
// }
// else
// {
// log().error("请输入erviceCheck类中addServiceCheck方法parameters参数!nodeid:"+nodeid);
// return;
// }
model.setParameters(parameters);
ServiceCheckService service = new ServiceCheckService();
service.setModel(model);
Schedule schedule =new Schedule(service,config,m_scheduler);
service.setMessageSend(messageSend);
service.setSchedule(schedule);
service.schedule();
serviceCheckMap.put(nodeid, service);
}
/**
* 删除一个服务
* @param nodeid
* @param type
* @param parameters
*/
public void removeServiceCheck(String nodeid)
{
if (serviceCheckMap.containsKey(nodeid)) {
ServiceCheckService service = serviceCheckMap.get(nodeid);
service.delete();
serviceCheckMap.remove(nodeid);
log().debug("取消一个曾ServiceCheck服务!nodeId:"+nodeid);
}else
{
log().debug("ServiceCheck服务该nodeId:"+nodeid+"不存在服务中!");
}
}
@Override
protected void onInit() {
log().debug("init: init ServiceCheck component");
createScheduler();
}
/**
* 获取monitor
* @param type
* @return
* @throws IOException
* @throws ClassNotFoundException
* @throws InstantiationException
* @throws IllegalAccessException
*/
public ServiceMonitor initMonitor(String type) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
InputStream is = this.getClass().getResourceAsStream("/application.properties");
Properties props = new Properties();
props.load(is);
String className = props.getProperty("servicecheck.monitor."+type);
// System.out.println(className);
if(null==className||"".equals(className))
{
return null;
}
Class clz = Class.forName(className);
is.close();
return (ServiceMonitor) clz.newInstance();
}
private void createScheduler() {
ThreadCategory log = log();
// Create a scheduler
try {
log.debug("init: Creating "+LOG4J_CATEGORY+" scheduler");
setScheduler(new LegacyScheduler(LOG4J_CATEGORY, m_threads));
} catch (RuntimeException e) {
log.fatal("init: Failed to create "+LOG4J_CATEGORY+" scheduler", e);
throw e;
}
}
@Override
protected void onStart() {
try {
if (log().isDebugEnabled())
log().debug("start: Starting snmp collectd scheduler");
getScheduler().start();
} catch (RuntimeException e) {
if (log().isEnabledFor(ThreadCategory.Level.FATAL))
log().fatal("start: Failed to start scheduler", e);
throw e;
}
try{
BroadcastEventProcessor processor = new BroadcastEventProcessor(this);
}catch (Exception ex) {
log().error("Failed to setup event reader", ex);
throw new UndeclaredThrowableException(ex);
}
}
@Override
protected void onStop() {
if (log().isDebugEnabled())
log().debug("stop: stoping snmp collectd scheduler");
if (getScheduler() != null) {
getScheduler().stop();
}
}
}