DispatcherServer.java
package progen.roles.distributed;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.AccessException;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;
import progen.context.ProGenContext;
import progen.kernel.error.Info;
import progen.roles.Task;
import progen.roles.Worker;
import progen.userprogram.UserProgram;
public class DispatcherServer extends UnicastRemoteObject implements DispatcherRemote {
public static final int UNASIGNED_TASKS = -10;
private static final int DEFAULT_DISPATCHER_SERVER_URL_LENGTH = 32;
private static final int ID_INFO = 3;
private static final String SLASH_SYMBOL = "/";
private static final String COLON_SYMBOL = ":";
private static final String PROGEN_DISPATCHER_NAME_PROPERTY = "progen.dispatcher.name";
private static final String PROGEN_ROLE_DISPATCHER_BIND_ADDRESS_PROPERTY = "progen.role.dispatcher.bindAddress";
private static final String PROGEN_ROLE_DISPATCHER_PORT_PROPERTY = "progen.role.dispatcher.port";
private static final long serialVersionUID = 1486658118278870720L;
private int port;
private String bindAddress;
private Registry registry;
protected DispatcherServer() throws RemoteException {
super();
port = ProGenContext.getOptionalProperty(PROGEN_ROLE_DISPATCHER_PORT_PROPERTY, Registry.REGISTRY_PORT);
bindAddress = getDefaultBindAddress();
bindAddress = ProGenContext.getOptionalProperty(PROGEN_ROLE_DISPATCHER_BIND_ADDRESS_PROPERTY, bindAddress);
ProGenContext.setProperty(PROGEN_ROLE_DISPATCHER_BIND_ADDRESS_PROPERTY, bindAddress);
}
private String getDefaultBindAddress() {
String address = "127.0.0.1";
try {
final InetAddress addr = InetAddress.getLocalHost();
address = addr.getHostName();
} catch (UnknownHostException e) {
// do nothing
}
return address;
}
@Override
public void asignTask(List<Task> tasks, UserProgram userProgram) throws RemoteException {
// TODO Auto-generated method stub
}
@Override
public List<Task> getResults() throws RemoteException {
// TODO Auto-generated method stub
return null;
}
@Override
public int totalTasksDone() throws RemoteException {
System.err.println("DispatcherServer: no total tasks done");
return UNASIGNED_TASKS;
}
@Override
public void stopTask() throws RemoteException {
try {
registry.unbind(DispatcherDistributed.DISPATCHER_NAME);
UnicastRemoteObject.unexportObject(registry, true);
} catch (AccessException e) {
throw new ProGenDistributedException(e.getMessage(),e);
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
@Override
public void addWorker(Worker worker) throws RemoteException {
// TODO Auto-generated method stub
}
@Override
public void start() throws RemoteException {
defineDispatcherName();
try {
System.getProperties().setProperty("java.rmi.server.hostname", bindAddress);
registry = LocateRegistry.createRegistry(port);
registry.bind(ProGenContext.getMandatoryProperty(PROGEN_DISPATCHER_NAME_PROPERTY), this);
for (String remoteService : registry.list()) {
Info.show(ID_INFO, bindAddress + COLON_SYMBOL + port + SLASH_SYMBOL + remoteService);
}
} catch (RemoteException | AlreadyBoundException e) {
throw new ProGenDistributedException(e.getLocalizedMessage(), e);
}
}
private void defineDispatcherName() {
String defaultName = DispatcherDistributed.DISPATCHER_NAME;
defaultName = ProGenContext.getOptionalProperty("progen.role.dispatcher.name", defaultName);
ProGenContext.setProperty(PROGEN_DISPATCHER_NAME_PROPERTY, defaultName);
}
@Override
public String toString() {
final StringBuilder dispatcherServer = new StringBuilder(DEFAULT_DISPATCHER_SERVER_URL_LENGTH);
dispatcherServer.append("rmi://");
dispatcherServer.append(ProGenContext.getMandatoryProperty(PROGEN_ROLE_DISPATCHER_BIND_ADDRESS_PROPERTY));
dispatcherServer.append(COLON_SYMBOL);
dispatcherServer.append(ProGenContext.getMandatoryProperty(PROGEN_ROLE_DISPATCHER_PORT_PROPERTY));
dispatcherServer.append(SLASH_SYMBOL);
dispatcherServer.append(DispatcherDistributed.DISPATCHER_NAME);
return dispatcherServer.toString();
}
}