esg.node.components.monitoring.ESGMonitor.java Source code

Java tutorial

Introduction

Here is the source code for esg.node.components.monitoring.ESGMonitor.java

Source

/***************************************************************************
 *                                                                          *
 *  Organization: Lawrence Livermore National Lab (LLNL)                    *
 *   Directorate: Computation                                               *
 *    Department: Computing Applications and Research                       *
 *      Division: S&T Global Security                                       *
 *        Matrix: Atmospheric, Earth and Energy Division                    *
 *       Program: PCMDI                                                     *
 *       Project: Earth Systems Grid (ESG) Data Node Software Stack         *
 *  First Author: Gavin M. Bell (gavin@llnl.gov)                            *
 *                                                                          *
 ****************************************************************************
 *                                                                          *
 *   Copyright (c) 2009, Lawrence Livermore National Security, LLC.         *
 *   Produced at the Lawrence Livermore National Laboratory                 *
 *   Written by: Gavin M. Bell (gavin@llnl.gov)                             *
 *   LLNL-CODE-420962                                                       *
 *                                                                          *
 *   All rights reserved. This file is part of the:                         *
 *   Earth System Grid (ESG) Data Node Software Stack, Version 1.0          *
 *                                                                          *
 *   For details, see http://esgf.org/esg-node/                    *
 *   Please also read this link                                             *
 *    http://esgf.org/LICENSE                                      *
 *                                                                          *
 *   * Redistribution and use in source and binary forms, with or           *
 *   without modification, are permitted provided that the following        *
 *   conditions are met:                                                    *
 *                                                                          *
 *   * Redistributions of source code must retain the above copyright       *
 *   notice, this list of conditions and the disclaimer below.              *
 *                                                                          *
 *   * Redistributions in binary form must reproduce the above copyright    *
 *   notice, this list of conditions and the disclaimer (as noted below)    *
 *   in the documentation and/or other materials provided with the          *
 *   distribution.                                                          *
 *                                                                          *
 *   Neither the name of the LLNS/LLNL nor the names of its contributors    *
 *   may be used to endorse or promote products derived from this           *
 *   software without specific prior written permission.                    *
 *                                                                          *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS    *
 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      *
 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS      *
 *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE    *
 *   LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR     *
 *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,           *
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT       *
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF       *
 *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND    *
 *   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,     *
 *   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT     *
 *   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF     *
 *   SUCH DAMAGE.                                                           *
 *                                                                          *
 ***************************************************************************/

/**
   Description:
    
   This class is a component implementation that is responsible for
   collecting and disseminating data node information. Statistics
   about the data node operation / usage.
    
**/
package esg.node.components.monitoring;

import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.impl.*;

import esg.common.db.DatabaseResource;
import esg.common.Utils;
import esg.node.core.*;

public class ESGMonitor extends AbstractDataNodeComponent {

    private static Log log = LogFactory.getLog(ESGMonitor.class);
    private Properties props = null;
    private boolean isBusy = false;
    private MonitorDAO monitorDAO = null;

    //Local cache object for results
    private MonitorInfo monitorInfo = null;

    public ESGMonitor(String name) {
        super(name);
        log.debug("Instantiating ESGMonitor...");
    }

    public void init() {
        log.info("Initializing ESGMonitor...");
        props = getDataNodeManager().getMatchingProperties("^monitor.*");
        monitorInfo = new MonitorInfo();
        monitorDAO = new MonitorDAO(DatabaseResource.getInstance().getDataSource(), Utils.getNodeID(), props);
        startMonitoring();
    }

    public MonitorInfo getMonitorInfo() {
        return monitorInfo;
    }

    private synchronized boolean fetchNodeInfo() {
        //log.trace("monitor's fetchNodeInfo() called....");
        boolean ret = true;
        monitorDAO.setMonitorInfo(monitorInfo);
        monitorInfo.componentList = getDataNodeManager().getComponentNames();
        return ret;
    }

    private void startMonitoring() {
        log.trace("launching system monitor timer");
        long delay = Long.parseLong(props.getProperty("monitor.initialDelay"));
        long period = Long.parseLong(props.getProperty("monitor.period"));
        log.trace("monitoring delay: " + delay + " sec");
        log.trace("monitoring period: " + period + " sec");

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public final void run() {
                //log.trace("Checking for new node information... [busy? "+ESGMonitor.this.isBusy+"]");
                if (!ESGMonitor.this.isBusy) {
                    ESGMonitor.this.isBusy = true;
                    if (fetchNodeInfo()) {
                        //TODO
                        monitorDAO.markLastCompletionTime();
                    }
                    ESGMonitor.this.isBusy = false;
                }
            }
        }, delay * 1000, period * 1000);
    }

    public boolean handleESGQueuedEvent(ESGEvent event) {
        log.trace("handling enqueued event [" + getName() + "]:[" + this.getClass().getName()
                + "]: Got A QueuedEvent!!!!: " + event);
        //TODO: grab the monitor information and push into event

        event.setData(getMonitorInfo().toString());
        enqueueESGEvent(event);
        return true;
    }

    public void handleESGEvent(ESGEvent event) {
        super.handleESGEvent(event);
    }

}