📄 poller.java
字号:
//// This file is part of the OpenNMS(R) Application.//// OpenNMS(R) is Copyright (C) 2002-2003 The OpenNMS Group, Inc. All rights reserved.// OpenNMS(R) is a derivative work, containing both original code, included code and modified// code that was published under the GNU General Public License. Copyrights for modified // and included code are below.//// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.//// Modifications://// 2003 Nov 11: Merged changes from Rackspace project// 2003 Oct 08: Implemented the poller release function.// 2003 Jan 31: Cleaned up some unused imports.//// Original code base Copyright (C) 1999-2001 Oculan Corp. All rights reserved.//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.//// For more information contact:// OpenNMS Licensing <license@opennms.org>// http://www.opennms.org/// http://www.opennms.com///package org.opennms.netmgt.poller;import java.lang.reflect.UndeclaredThrowableException;import java.net.InetAddress;import java.net.UnknownHostException;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Timestamp;import java.util.Date;import java.util.Enumeration;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.log4j.Category;import org.apache.log4j.Priority;import org.opennms.core.fiber.PausableFiber;import org.opennms.core.utils.ThreadCategory;import org.opennms.netmgt.EventConstants;import org.opennms.netmgt.config.DbConnectionFactory;import org.opennms.netmgt.config.PollOutagesConfig;import org.opennms.netmgt.config.PollerConfig;import org.opennms.netmgt.config.poller.Package;import org.opennms.netmgt.eventd.EventIpcManager;import org.opennms.netmgt.poller.monitors.ServiceMonitor;import org.opennms.netmgt.poller.pollables.DbPollEvent;import org.opennms.netmgt.poller.pollables.PollEvent;import org.opennms.netmgt.poller.pollables.PollStatus;import org.opennms.netmgt.poller.pollables.PollableElement;import org.opennms.netmgt.poller.pollables.PollableNetwork;import org.opennms.netmgt.poller.pollables.PollableNode;import org.opennms.netmgt.poller.pollables.PollableService;import org.opennms.netmgt.poller.pollables.PollableServiceConfig;import org.opennms.netmgt.poller.pollables.PollableVisitor;import org.opennms.netmgt.poller.pollables.PollableVisitorAdaptor;import org.opennms.netmgt.scheduler.Schedule;import org.opennms.netmgt.scheduler.Scheduler;import org.opennms.netmgt.utils.Querier;import org.opennms.netmgt.utils.Updater;import org.opennms.netmgt.xml.event.Event;import org.opennms.netmgt.xml.event.Parm;import org.opennms.netmgt.xml.event.Parms;import org.opennms.netmgt.xml.event.Value;public final class Poller implements PausableFiber { private final static Poller m_singleton = new Poller(); private int m_status = START_PENDING; private boolean m_initialized = false; private Map m_svcNameToId = new HashMap(); private Map m_svcIdToName = new HashMap(); private Scheduler m_scheduler = null;; private PollerEventProcessor m_receiver; private PollableNetwork m_network = new PollableNetwork(new DefaultPollContext(this)); private QueryManager m_queryMgr = new DefaultQueryManager(); private PollerConfig m_pollerConfig; private PollOutagesConfig m_pollOutagesConfig; private EventIpcManager m_eventMgr; private DbConnectionFactory m_dbConnectionFactory; public static final String EVENT_SOURCE = "OpenNMS.Poller"; public synchronized void init() { // get the category logger Category log = ThreadCategory.getInstance(getClass()); // set the DbConnectionFactory in the QueryManager m_queryMgr.setDbConnectionFactory(m_dbConnectionFactory); // create service name to id maps createServiceMaps(); // serviceUnresponsive behavior enabled/disabled? log.debug("init: serviceUnresponsive behavior: " + (getPollerConfig().serviceUnresponsiveEnabled() ? "enabled" : "disabled")); createScheduler(); try { log.debug("init: Closing outages for unmanaged services"); closeOutagesForUnmanagedServices(); } catch (Exception e) { log.error("init: Failed to close ouates for unmanage services", e); } // Schedule the interfaces currently in the database // try { log.debug("start: Scheduling existing interfaces"); scheduleExistingServices(); } catch (Exception sqlE) { log.error("start: Failed to schedule existing interfaces", sqlE); } // Create an event receiver. The receiver will // receive events, process them, creates network // interfaces, and schedulers them. // try { log.debug("start: Creating event broadcast event processor"); m_receiver = new PollerEventProcessor(this); } catch (Throwable t) { log.fatal("start: Failed to initialized the broadcast event receiver", t); throw new UndeclaredThrowableException(t); } m_initialized = true; } /** * */ private void closeOutagesForUnmanagedServices() { Timestamp closeTime = new Timestamp((new java.util.Date()).getTime()); final String DB_CLOSE_OUTAGES_FOR_UNMANAGED_SERVICES = "UPDATE outages set ifregainedservice = ? where outageid in (select outages.outageid from outages, ifservices where ((outages.nodeid = ifservices.nodeid) AND (outages.ipaddr = ifservices.ipaddr) AND (outages.serviceid = ifservices.serviceid) AND ((ifservices.status = 'D') OR (ifservices.status = 'F') OR (ifservices.status = 'U')) AND (outages.ifregainedservice IS NULL)))"; Updater svcUpdater = new Updater(m_dbConnectionFactory, DB_CLOSE_OUTAGES_FOR_UNMANAGED_SERVICES); svcUpdater.execute(closeTime); final String DB_CLOSE_OUTAGES_FOR_UNMANAGED_INTERFACES = "UPDATE outages set ifregainedservice = ? where outageid in (select outages.outageid from outages, ipinterface where ((outages.nodeid = ipinterface.nodeid) AND (outages.ipaddr = ipinterface.ipaddr) AND ((ipinterface.ismanaged = 'F') OR (ipinterface.ismanaged = 'U')) AND (outages.ifregainedservice IS NULL)))"; Updater ifUpdater = new Updater(m_dbConnectionFactory, DB_CLOSE_OUTAGES_FOR_UNMANAGED_INTERFACES); ifUpdater.execute(closeTime); } public void closeOutagesForNode(Date closeDate, int eventId, int nodeId) { Timestamp closeTime = new Timestamp(closeDate.getTime()); final String DB_CLOSE_OUTAGES_FOR_NODE = "UPDATE outages set ifregainedservice = ?, svcRegainedEventId = ? where outages.nodeId = ? AND (outages.ifregainedservice IS NULL)"; Updater svcUpdater = new Updater(m_dbConnectionFactory, DB_CLOSE_OUTAGES_FOR_NODE); svcUpdater.execute(closeTime, new Integer(eventId), new Integer(nodeId)); } public void closeOutagesForInterface(Date closeDate, int eventId, int nodeId, String ipAddr) { Timestamp closeTime = new Timestamp(closeDate.getTime()); final String DB_CLOSE_OUTAGES_FOR_IFACE = "UPDATE outages set ifregainedservice = ?, svcRegainedEventId = ? where outages.nodeId = ? AND outages.ipAddr = ? AND (outages.ifregainedservice IS NULL)"; Updater svcUpdater = new Updater(m_dbConnectionFactory, DB_CLOSE_OUTAGES_FOR_IFACE); svcUpdater.execute(closeTime, new Integer(eventId), new Integer(nodeId), ipAddr); } public void closeOutagesForService(Date closeDate, int eventId, int nodeId, String ipAddr, String serviceName) { Timestamp closeTime = new Timestamp(closeDate.getTime()); final String DB_CLOSE_OUTAGES_FOR_SERVICE = "UPDATE outages set ifregainedservice = ?, svcRegainedEventId = ? where outageid in (select outages.outageid from outages, service where outages.nodeid = ? AND outages.ipaddr = ? AND outages.serviceid = service.serviceId AND service.servicename = ? AND outages.ifregainedservice IS NULL)"; Updater svcUpdater = new Updater(m_dbConnectionFactory, DB_CLOSE_OUTAGES_FOR_SERVICE); svcUpdater.execute(closeTime, new Integer(eventId), new Integer(nodeId), ipAddr, serviceName); } private void createScheduler() { Category log = ThreadCategory.getInstance(getClass()); // Create a scheduler // try { log.debug("init: Creating poller scheduler"); m_scheduler = new Scheduler("Poller", getPollerConfig().getThreads()); } catch (RuntimeException e) { log.fatal("init: Failed to create poller scheduler", e); throw e; } } /** * */ private void createServiceMaps() { // load the serviceId to serviceName tables getQueryMgr().buildServiceNameToIdMaps(m_svcNameToId, m_svcIdToName); } public synchronized void start() { m_status = STARTING; // get the category logger Category log = ThreadCategory.getInstance(getClass()); // start the scheduler // try { if (log.isDebugEnabled()) log.debug("start: Starting poller scheduler"); m_scheduler.start(); } catch (RuntimeException e) { if (log.isEnabledFor(Priority.FATAL)) log.fatal("start: Failed to start scheduler", e); throw e; } // Set the status of the service as running. // m_status = RUNNING; if (log.isDebugEnabled()) log.debug("start: Poller running"); } public synchronized void stop() { m_status = STOP_PENDING; m_scheduler.stop(); m_receiver.close(); Iterator iter = getServiceMonitors().values().iterator(); while (iter.hasNext()) { ServiceMonitor sm = (ServiceMonitor) iter.next(); sm.release(); } m_scheduler = null; m_status = STOPPED; Category log = ThreadCategory.getInstance(getClass()); if (log.isDebugEnabled()) log.debug("stop: Poller stopped"); } public synchronized void pause() { if (m_status != RUNNING) return; m_status = PAUSE_PENDING; m_scheduler.pause(); m_status = PAUSED; Category log = ThreadCategory.getInstance(getClass()); if (log.isDebugEnabled()) log.debug("pause: Poller paused"); } public synchronized void resume() { if (m_status != PAUSED) return; m_status = RESUME_PENDING; m_scheduler.resume(); m_status = RUNNING; Category log = ThreadCategory.getInstance(getClass()); if (log.isDebugEnabled()) log.debug("resume: Poller resumed"); } public synchronized int getStatus() { return m_status; } public String getName() { return "OpenNMS.Poller"; } public static Poller getInstance() { return m_singleton; } public Scheduler getScheduler() { return m_scheduler; } public ServiceMonitor getServiceMonitor(String svcName) { return getPollerConfig().getServiceMonitor(svcName); } public PollableNetwork getNetwork() { return m_network; } static private class InitCause extends PollableVisitorAdaptor { private PollEvent m_cause; public void setCause(PollEvent cause) { m_cause = cause; } public void visitElement(PollableElement element) { if (!element.hasOpenOutage()) element.setCause(m_cause); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -