Code Search for Developers
 
 
  

DiscoveryThread.java from GridBlocks at Krugle


Show DiscoveryThread.java syntax highlighted

/*
 * Copyright (c) 2005
 * Helsinki Institute of Physics
 * see LICENSE file for details
 *
 * DiscoveryThread.java
 * Created on Sep 19, 2005 
 */

package fi.hip.gb.net.discovery;

import java.net.URL;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;

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

import fi.hip.gb.core.Config;
import fi.hip.gb.utils.NetUtils;

/**
 * Service to publish the status of the server periodatically to the parent
 * servers. Controllable through MBean.
 * 
 * @author Juho Karppinen
 */
public class DiscoveryThread extends TimerTask implements DiscoveryThreadMBean {
    /** list of discovery server <code>URL</code>s */
    private static Vector<URL> discoveryServers = new Vector<URL>();
    
    /** timer for discovering services */
    private static Timer timer = null;
    
    private static Log log = LogFactory.getLog(DiscoveryThread.class);
    
    public DiscoveryThread() {
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#printDiscoveryServers()
     */
    public String printDiscoveryServers() {
        StringBuffer str = new StringBuffer("<table>\n");
        for (Iterator<URL> iter = discoveryServers.iterator(); iter.hasNext();) {
            URL element = iter.next();
            str.append("<tr><td>").append(element).append("</td></tr>\n");
        }
        str.append("</table>\n");
        return str.toString();
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#printServers()
     */
    public String printServers() throws RemoteException {
        StringBuffer str = new StringBuffer();
        
        DiscoveryPacket[] servers = DiscoveryService.getInstance().listServices();
        str.append("Discovered " +  servers.length + " servers:<ul>\n");
        for(int i=0; i < servers.length; i++) {
            str.append("<li><a href=\"");
            str.append(servers[i].getServiceURL());
            str.append("\">" + servers[i].getServiceURL() + "</a>");
            str.append(" (").append(servers[i].getLastResponse() / 1000).append(" s ago)");
            str.append("</li>\n");
        }
        str.append("</ul>\n");
        return str.toString();
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#printAgents()
     */
    public String printAgents() throws RemoteException {
        AgentPacket[] services = DiscoveryService.getInstance().listAgents();
        StringBuffer str = new StringBuffer();
        str.append("Discovered " +  services.length + " services:<ul>\n");
        for(int i=0; i < services.length; i++) {
            str.append("<li>" + services[i].getServiceClass() + "");
            str.append(" (" + services[i].getServiceID() + ", " + services[i].getServiceDescription() + ")<ul>");
            DiscoveryPacket[] hosts = services[i].getServers();
            for(int k=0; k < hosts.length; k++) {
                str.append("<li><a href=\"");
                str.append(hosts[k].getServiceURL().toString());
                str.append("\">" + hosts[k].getServiceURL().toString() + "</a>");
                str.append(" (").append(hosts[k].getLastResponse() / 1000).append(" s ago)\n");
                if(hosts[k].getJars().length > 0) {
                    str.append("[ <a href=\"");
                    str.append(hosts[k].getJars()[0].toString());
                    str.append("\">file</a> ]\n");
                }
                str.append("</li>\n");
            }
            str.append("</ul></li>\n");
        }
        str.append("</ul>\n");
        return str.toString();
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#addDiscoveryServers(java.net.URL)
     */
    public void addDiscoveryServers(URL serviceURL ) {
        discoveryServers.add(serviceURL);
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#removeDiscoveryServers(java.net.URL)
     */
    public void removeDiscoveryServers(URL serviceURL ) {
        discoveryServers.remove(serviceURL);
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#start()
     */
    public void start() throws Exception {
        // gets a list of known discovery servers
        /*
        String[] serverNames = Config.getInstance().getDiscoveryURLs();
        
        for(int i=0; i < serverNames.length; i++) {
            try {
                URL url = new URL(serverNames[i]);
                if (!NetUtils.isLocalService(url.toExternalForm())) {
                    discoveryServers.add(url);
                    log.debug("Starting to publish discovery messages to: "
                            + serverNames[i]
                            + ", local identity is "
                            + DiscoveryService.getInstance().getLocalService());
                } else {
                    log.debug("Removing local discovery server: "
                            + serverNames[i] 
                            + ", local identity is "
                            + DiscoveryService.getInstance().getLocalService());
                }
            } catch (Exception e) {
                log.error("cannot add discovery server "
                    + serverNames[i] + ", removing from the list: "
                    + e.getClass().getName() + ":" + e.getMessage());
            }
        }
        
//      check discoveried hosts every x seconds, starting after 10sec from now
        stop();
        if(Config.getInstance().getDiscoveryRate() > 0) {
            timer = new Timer();
            timer.scheduleAtFixedRate(this, 10 * 1000, Config.getInstance().getDiscoveryRate() * 1000);
        }*/
    }
    
    /*
     * @see fi.hip.gb.server.jmx.DiscoveryThreadMBean#stop()
     */
    public void stop() {
        if(timer != null) {
            timer.cancel();
            timer = null;
        }
    }
    
    /**
     * Called by timer to update the state of the network every now and then.
     */
    public void run() {
        if(timer == null)
            return;
        
        // first validate and remove old entities
        DiscoveryService.getInstance().validateServices();
        
        // broadcast our services to every known discovery server
        for (Iterator iter = discoveryServers.iterator(); iter.hasNext();) {
            URL element = (URL) iter.next();
            try {
                fi.hip.gb.net.rpc.DiscoveryService ds = 
                    new fi.hip.gb.net.rpc.DiscoveryService(element.toString());
                
                DiscoveryPacket packet = new DiscoveryPacket(DiscoveryService.getInstance().getLocalService());
                packet.setAgents(DiscoveryService.getInstance().getSupportedAgents());
                packet.jars(DiscoveryService.getInstance().getDeployedJars());
                ds.addService(packet);
                /*
                Logger.debug("Discovery request sent from " 
                        + ds.getContextURL() 
                        + " to " + discoveryServers[i]);
                */
            } catch (Exception e) {
                log.error("Could not send discovery request to "
                        + element + " " + e.getClass().getName(), e);
            }
        }
    }
    
}



See more files for this project here

GridBlocks

GridBlocks builds a grid application framework via easy-to-use building blocks in distributed environment. The framework offers components for Grid security, distributed storage, computing, and Portlet web interfaces.

Project homepage: http://sourceforge.net/projects/gridblocks
Programming language(s): Java,JSP,XML
License: other

  AgentPacket.java
  DiscoveryPacket.java
  DiscoveryService.java
  DiscoveryThread.java
  DiscoveryThreadMBean.java
  JAXR.java