/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package org.jgap.distr.grid;
import org.apache.log4j.*;
import org.homedns.dade.jcgrid.*;
import org.homedns.dade.jcgrid.worker.*;
import org.apache.commons.cli.*;
import org.homedns.dade.jcgrid.cmd.MainCmd;
/**
* A worker receives work units from a JGAPServer and sends back computed
* solutions to a JGAPServer.
*
* @author Klaus Meffert
* @since 3.01
*/
public class JGAPWorkers {
/** String containing the CVS revision. Read out via reflection!*/
private final static String CVS_REVISION = "$Revision: 1.6 $";
private Class m_workerClass;
private Class m_workerFeedbackClaas;
private final static String className = JGAPWorkers.class.getName();
private static Logger log = Logger.getLogger(className);
public JGAPWorkers(String[] args)
throws Exception {
MainCmd.setUpLog4J("worker", true);
GridNodeWorkerConfig config = new GridNodeWorkerConfig();
Options options = new Options();
CommandLine cmd = MainCmd.parseCommonOptions(options, config, args);
if (config.getSessionName().equals("none")) {
config.setSessionName("MyGAWorker_session");
}
getNeededFiles(config);
startWork(config);
}
/**
* Get jar and other files needed for computation from server .
*
* @param a_config GridNodeWorkerConfig
*/
public void getNeededFiles(GridNodeWorkerConfig a_config) {
/**@todo*/
// determine files
// request files
// get files
// class-load jar files
}
public JGAPWorkers(GridNodeWorkerConfig a_config)
throws Exception {
startWork(a_config);
}
protected void startWork(GridNodeWorkerConfig a_config)
throws Exception {
// Start all required workers.
// ---------------------------
GridWorker[] gw = new GridWorker[a_config.getWorkerCount()];
for (int i = 0; i < a_config.getWorkerCount(); i++) {
// Instantiate worker via reflection.
// ----------------------------------
gw[i] = new GridWorker();
gw[i].setNodeConfig( (GridNodeGenericConfig) a_config.clone());
( (GridNodeGenericConfig) gw[i].getNodeConfig()).
setSessionName(a_config.getSessionName() + "_" + i);
( (GridNodeGenericConfig) gw[i].getNodeConfig()).
setWorkingDir(a_config.getWorkingDir() + "_" + i);
Worker myWorker = new JGAPWorker();
// Instantiate worker feedback.
// ----------------------------
gw[i].setWorker(myWorker);
// GridWorkerFeedback myWorkerFeedback = (GridWorkerFeedback)
// a_workerFeedbackClaas.newInstance();
// gw[i].setWorkerFeedback(myWorkerFeedback);
// Start single worker.
// --------------------
gw[i].start();
}
// Wait for shutdown of workers.
// -----------------------------
for (int i = 0; i < a_config.getWorkerCount(); i++) {
gw[i].waitShutdown();
}
}
/**
* Convenience method to start a worker or multiple instances of it.
* For possible parameters see method
* parseCommonOptions in class org.homedns.dade.jcgrid.cmd.MainCmd. The most
* important parameters are:
* -n <session name without spaces>
* -s <server IP address>
* -d <working directory>
* -c <number of workers to run>
*
* @param args see above
* @throws Exception
*
* @author Klaus Meffert
* @since 3.2
*/
public static void main(String[] args)
throws Exception {
MainCmd.setUpLog4J("worker", true);
GridNodeWorkerConfig config = new GridNodeWorkerConfig();
Options options = new Options();
CommandLine cmd = MainCmd.parseCommonOptions(options, config, args);
// Start worker(s).
// ----------------
new JGAPWorkers(config);
}
}