RMI - Iniciante

Pessoal, alguém poderia me explicar o que é RMI e p/ que server.
Se possível com um exemplo de uso.

(Vi que no Guj tem um artigo a respeito, mas o site tá dando vários Exception quando tento acessar os artigos, então não consegui ler)

Obrigado!

gmarcon,

Dá uma lida nisso:
http://www.dca.fee.unicamp.br/cursos/PooJava/objdist/javarmi.html

Tutorial:
http://www.ccs.neu.edu/home/kenb/com3337/rmi_tut.html

ASOBrasil

Obrigado !

Eu até já tinha lido alguma coisa e entendi o conceito mas não a aplicação.

Você poderia me dar um exemplo de onde isso é muito usado?
Para resolver que tipo de problemas, fazer oque etc…

(É que estou procurando uma solução p/ uma aplicação que estou desenvolvendo e pelo andar da carruagem talvez isso seja a resposta que eu preciso)

Obrigado !

RMI nada mais é do que vc poder invocar métodos remotamente, como o próprio nome diz. :-o

Tem várias utilidades, principalmente voltada para sistemas distribuídos.
Geralmente é aplicado em distribuição de tarefas, ambientes colaborativos, aplicações remotas, etc…

Por exemplo:
Vamos supor que você tem várias tarefas de alto custo computacional para processar. Para resolver isso, você cria threads que fazem esse processamento e coloca pra rodar cada thread dessa em uma máquina diferente (caraterizando um sistema distribuído). Você também criaria um singleton que faria o trabalho de gerenciador e balanceador de tarefas para as threads. Esse singleton instancia essas threads e acessa os métodos (remotos) adicionando tarefa para elas.

Na prática seria algo assim:
(código no singleton)

Worker worker = (Worker) Naming.lookup("192.168.0.1/worker"); //instanciando a thread (cast é feio, mas aqui nao tem jeito) worker.processa(13123); //Acessando um método remoto (o qual deve estar declarado na interface)

E as Threads nada mais são do que classes comuns implementando uma interface para o rmic gerar o Stub.

Acho que é isso,
se não ficou claro diz aí que a gente melhora a idéia.

Bom, talvez minha necessidade nem tenha nada a ver com RMI, mas fiquei curisoso em saber.

Irei aproveitar então para tentar tirar minha duvida.

Estou desenvolvendo uma aplicação Comercial, onde eu pretendo usar o banco de dados mySQL.

Para fazer o acesso ao banco tenho que informar servidor, base de dados, usuário e senha, então pensei em fornecer estes dados atravéz de um arquivo texto, onde ficaria fácil para alterar os dados caso meu cliente necessite (pois não sei qual nome de host, senha ou user ele vai usar no mysql que ele tiver instalado na máquina, vai de cada caso).

Esta aplicação deve ser usada em mais ou menos 10 máquinas em rede e minha duvida ficou justamente se eu teria que ter esse arquivo texto configurado de máquina em máquina informando como a aplicação deve fazer o acesso ao mySQL, pois assim fica fácil de qualquer usuário abrir o arquivo, conhecer os dados do mySQL e poder alterar dados normalmente direto na base, acabando com a segurança do meu sistema.

Pensei então em centralizar as config. no servidor. Mas como?
Como as máquinas clientes irão conhecer o servidor?
O que devo fazer no servidor para ele entregar o que deve ser entregue p/ as estações.

Me desculpem se essas perguntas parecerem idiotas, mas é que venho de programação web (PHP) e não tenho esses conceitos, por isso se puderem me ajudar agradeço muito.

Obrigado !

Coloca a senha do banco dentro do fonte do programa. Já a senha de acesso ao sistema você usa hash. Não sei se tem um jeito melhor.

Sua aplicação possui um módulo servidor? De qualquer forma você vai ter que configurar esse servidor mesmo… Se você puder fazer isso com o instalador, porque você não cria um arquivo de configuração e o instalador lê esse arquivo e faz uma instalação automatizada?

É justamente sobre este módulo servidor que estou falando…
Como eu faria isso? O que uso para ter algo respondendo como servidor das requisições das estações clientes?

Obrigado!

É justamente isso que tava pensando esses dias e ainda não tenho a resposta.

No seu caso, se for só por causa da configuração, a minha idéia é tu criar um esquema de autenticação próprio do sistema, com o cadastro de usuários no banco, e a conexão com o banco você configura nos clientes mesmo, considerando a idéia da instalação automatizada, e a senha do banco você coloca dentro da aplicação.

Ou então criptografa ela e coloca permissão de segurança no arquivo de chave. Mas aí sei lá, já deve começar a complicar.

Tem um driver ODBC para MySQL que você coloca o servidor, a porta, o usuário e senha que fica em asteriscos. Só que entra no registro do Windows só, tu vai ver a senha lá escancarada!

Alguém tem alguma idéia mais?

Será que a utlização de RMI se encaixaria nesse caso?

Desenvolver uma classe que trate de tudo o que se refira banco de dados e rode somente no servidor.

Assim bastaria configurar algo no servidor, restringir as politicas de acesso e fazer com que as estações conheçam o servidor ( somente o IP ) e façam acesso atravéz dos objetos que rodam no servidor?

Viajei ou seria uma das utilizações?

Se alguém souber de algum modo mais simples de fazer e/ou tiver exemplos de código, tutoriais, que tratem disso, agradeço muito.

Preciso resolver o modo de acesso ao banco para continuar a desenvolver meu projeto.

Obrigado !

Então,

pra isso serviria sim. É claro que não é a grande utilidade do RMI… mas quebra o galho.

Por exemplo, cada máquina cliente invocaria os métodos para obter os dados da conex. Você teria um arquivo.properties em cada cliente que contivesse o ip da máquina que estivesse com o rmi server rodando (servidor).

Daí cada cliente, ao iniciar, carregava esse arquivo contendo o ip do servidor, e acessaria algum método que informa os dados da conex com o banco.

Na prática seria algo assim:

ConexInfo cnInfo = (IConexInfo) Naming.lookup(properties.getProperty("ipservidor")+"/conexinfo");
String login = cnInfo.getLogin();
String senha = cnInfo.getSenha();

Seria isso. Nos clientes iria ter somente um arquivo com o ip do servidor rmi. É claro que vc teria que tomar cuidado em manter sempre sua classe de rmi server e o rmiregistry rodando no servidor.

A idéia é essa, se vc for implementar dessa forma posso te passar umas dicas e uns códigos de rmi.

poxa cara obrigado pela força !!!

Então, eu to pensando em fazer por RMI, mas vc disse q essa ñ seria q grande utilidade do RMI… Qual seria (Só p/ matar a curiosidade)

E ao invéz de usar RMI, qual seria outra forma de fazer isso?
Como grandes aplicações controlam esse tipo de coisa?

Peço isso pois eu gostaria de fazer da forma mais correta e não usar uma coisa como RMI p/ resolver um problema que poderia ser facilmente resolvido de outra forma, mas que não estou conseguindo enchergar agora.

No mais muito obrigado !

[quote=gmarcon]poxa cara obrigado pela força !!!

pra isso serviria sim. É claro que não é a grande utilidade do RMI… mas quebra o galho.

Então, eu to pensando em fazer por RMI, mas vc disse q essa ñ seria q grande utilidade do RMI… Qual seria (Só p/ matar a curiosidade)
[/quote]

Então cara,

uma grande utilidade do RMI seria utilizá-lo como um sistema distribuído efetivamente. Fiz um sistema mês passado que tinha N threads distribuídas que faziam o processamento de determinados dados. Aí sim seria tirar um bom proveito do RMI. Mas no teu caso ele resolveria mesmo.

Bom, não vejo outra forma agora… deve haver sim. Mas essa com RMI ficaria elegante até :slight_smile:

E não tenho muita idéia de como outras aplicações fariam isso. Sei q tem muita gente que faz um negócio meio largado mesmo, colocando tudo as conex no código mesmo né :x

[quote]
Peço isso pois eu gostaria de fazer da forma mais correta e não usar uma coisa como RMI p/ resolver um problema que poderia ser facilmente resolvido de outra forma, mas que não estou conseguindo enchergar agora.

No mais muito obrigado ![/quote]

Realmente, com RMI esse negocio vai ficar show…

Vou aceitar teus códigos, já que não tenho nem noção de como usar RMI corretamente… :smiley:

E mais uma vez mto obrigado !!! 8)

O seu RMIServer seria mais ou menos assim:

	//Carrega algumas configuracoes do arquivo
        String path = RMIServer.class.getResource("/").getPath();
        path = path.replace("%20"," ");			
        Properties properties = new Properties();
        
        try {
            properties.load(new FileInputStream(path+ARQUIVO));
        } catch (IOException e) {
            log.error("Erro: Não foi possível carregar o arquivos de pesos para comparação. Verifique se o arquivo se encontra na pasta classes e com o nome: "+ARQUIVO);
            throw e;
        }

//infoConex seria seu objeto onde estaria as informações da conexão
//Nesse caso eu tentaria fazer essa InfoConex uma classe estática.. mas não sei se o rmi suportaria
     InfoConex infoConex = new InfoConex;
     infoConex.load();

     Naming.rebind("//localhost:"+properties.getProperty("porta")+"/server", infoConex);

No cliente algo assim:

		// Carregando o arquivo com as propriedades
		Properties properties = new Properties();
		List<String> ips = new LinkedList<String>();
		String path = Cliente.class.getResource("/").getPath();
		path = path.replace("%20", " ");
          	properties.load(new FileInputStream(path+NOMEDOARQUIVO));

                InfoConex = (InterfaceInfoConex)                                 Naming.lookup(properties.getProperty("ipdoservidor")+"/server");

                String login = InfoConex.getLogin();
                //e por aí vai

Lembre-se que quando subir o rmiregisty as suas classes deve estar no classpath.

De qualquer forma não deixe de ler algum tutorial de RMI aí.