Variavel para static perdendo valor conforme a execução - RMI

1 resposta
R

Olá,

tenho que implementar um servidor com base em RMI para fazer a transferencias de dados para um sistema distribuído

estou tendo grande dificuldade com a variavel nameServer de meu código, pois preciso que ela não se altere conforme a execução de uma novo servidor, por exemplo quando eu instancio 1 servidor a variavel está com o nome correto, ao instanciar o segundo ela está reescrevendo a variavel também do primeiro, eu sei que esta ação se deve ao fato de que ela está como static, mas eu necessito dela para pode instanciar o meu servidor. pelo static void main da classe server....
a minha classe server é disparada pela classe starter.

starter.java
import java.rmi.RemoteException;
import java.rmi.server.RemoteRef;
import java.util.ArrayList;

public class Starter {
	public static void main (String args[]){
		Server server1,server2;
		int numServ =1;
		ArrayList <Server> servidores = new ArrayList();	
		
		try {
				//Criação do servidor 1
				server1 = new Server(numServ);
				numServ++;
				servidores.add(server1);
				//Criação do servidor 2
				server2 = new Server(numServ);
				numServ++;
				servidores.add(server2);

}
server.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Stack;
import java.util.Random;

public class Server extends UnicastRemoteObject implements IServer{
 
	ArrayList <Project> projects = new ArrayList();
	ArrayList servidores = new ArrayList();
	static Server serv;
	static String nameServer ;
	private int IDServer;
	private boolean statusServer=false;
	 
	//set ID for the current Server
	public Server(int IDServer) throws RemoteException {
		this.IDServer=IDServer;
		setName("Servidor-"+this.IDServer);
		statusServer=true;
	}
		
	protected Server() throws RemoteException {
		super();
		
	}
	   public static void main(String args[]) 
	    {
		   //Mensagem para verificar a criação do servidor
		   System.out.println("Servidor Iniciado");
	        try  //special exception handler for registry creation
	        {	LocateRegistry.createRegistry(1099); 
	         	System.out.println("Servidor Criado com Sucesso :)");
	        }
	        catch (RemoteException e)
	        {	//do nothing, error means registry already exists
	            System.out.println("Servidor não Registrado");
	        }
	        try
	        { //Instantiate RmiServer
	           IServer obj = new Server();
	 	   // Bind this object instance to the name "RmiServer"
	           Naming.rebind(nameServer, obj); 
	            System.out.println("Criando "+nameServer);
	        } 
	        catch (Exception e) 
	        {
	            System.err.println("Erros encontrados: ");
	            e.printStackTrace();
	        }
	    }
	private void setName(String name){
			 nameServer=name;
	}
		
}

1 Resposta

marcelocenerine

Não entendi mto bem seu código, mas se vc inicia sua aplicação pela classe “Starter”, vc n precisa ter um método “main” também na sua classe “Server”.
O código colocado no método “main” da classe server são ações de inicialização? Caso seja essa a intenção, transforme ele em um método non-static (private) (init, por ex.) e chame-o no construtor. Seu atributo “serverName” tbm n precisaria ser static.

Criado 5 de outubro de 2011
Ultima resposta 5 de out. de 2011
Respostas 1
Participantes 2