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