Você está na página 1de 10

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Tutorial
Desenvolvimento de Aplicaes Java/CORBA
Emerson Ribeiro de Mello, Fbio Favarim e Joni da Silva Fraga
{emerson, fabio, fraga}@das.ufsc.br
Este tutorial ensina como criar uma aplicao distribuda CORBA utilizando o JacORB.
O exemplo abordado neste tutorial um simples sistema de envio de mensagens eletrnicas,
trocadas entre um cliente e um servidor. Com este exemplo possvel conhecer todas as tarefas
envolvidas em uma aplicao distribuda.
Os passos a seguir mostram resumidamente, o que est envolvido no processo
desenvolvimento uma aplicao distribuda CORBA:
1. Definio da interface remota do objeto
Deve-se definir primeiramente a interface remota do objeto usando a Linguagem de
Definio de Interface da OMG (IDL-Interface Definition Language).
2. Compilao da IDL
Nesta etapa sero gerados os cdigos Java da interface, assim como os stubs e
skeletons do objeto.
3. Implementao da interface (servant)
Nesta etapa implementado em JAVA a interface descrita na IDL. A implementao
da interface denominada servant.
4. Implementao do servidor
Que responsvel por criar os objetos e por registra-los no servio de nomes, assim
como aguardar pelas invocaes dos clientes remotos. O servidor usa os skeletons
gerados pelo compilador IDL, para facilitar a comunicao.
5. Implementao do cliente
O cliente responsvel por obter a referncia para o objeto remoto e fazer a chamada
aos mtodos. Similarmente ao servidor, o cliente usa os Stubs gerados pelo
compilador IDL como base da aplicao cliente.
6. Compilando e executando as aplicaes
Compilao das classes
1
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Iniciar o servio de nomes


Executar o servidor
Executar o cliente

Desenvolvimento da Aplicao
Descrio
Um sistema de envio de mensagens eletrnica, onde as mensagens so compostas por
um emissor, destinatrio, assunto e corpo da mensagem. O lado servidor da aplicao ser
responsvel por receber as mensagens enviadas pelo lado cliente. O cliente dever fornecer uma
forma de que se possa compor um mensagem e envi-la para o servidor.

Definio da Interface
O servidor possui o mtodo enviar_msg(mensagem email), que tem como retorno uma
cadeia de caracteres, informando ao objeto que requisitou o mtodo uma mensagem de
confirmao indicando se a comunicao foi ou no bem sucessida.

Escrevendo a interface IDL (tutorial.idl)


module tutorial {
struct mensagem{
string emissor;
string destinatario;
string assunto;
string corpo;
};
interface correio{
string enviar_msg(in mensagem email);
};
};

Compilando a IDL (JacORB1 1.4)


Para compilar a IDL basta executar o seguinte comando:
idl tutorial.idl

Para este exemplo foi usado o ORB JacORB 1.4, disponvel em http://www.jacorb.org , porm pode-se utilizar
qualquer ORB que esteja de acordo com a especificao CORBA v2.3

2
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

O compilador IDL do JacORB ir gerar 6 arquivos em um sub-diretrio com o mesmo


nome do mdulo definido na IDL : tutorial.
correio.java

Esta interface contem a verso Java da interface correio (correio.idl). A


classe correio.java estende a interface org.omg.CORBA.Object, para fornecer a
funcionalidade dos objetos CORBA.

O arquivo correio.java:
package tutorial;
/**
*
*
*/

Generated from IDL definition of interface "correio"


@author JacORB IDL compiler

public interface correio


extends correioOperations,
org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity{}

O mapeamento das sentenas em IDL para JAVA.


IDL
interface correio
module tutorial

Java
public interface correio
package tutorial;

correioOperations.java

Esta classe contem os mtodos da interface correio (enviar_msg(mensagem


email)). Todas as operaes definidas na interface IDL so mapeadas para Java e
colocadas no arquivo de operaes. Para a interface correio, o arquivo correspondente
seria:
package tutorial;
/**
*
*
*/

Generated from IDL definition of interface "correio"


@author JacORB IDL compiler

public interface correioOperations {


/* constants */
/* operations */

3
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


java.lang.String enviar_msg(tutorial.mensagem email);
}

correioPOA.java

Esta classe o skeleton do servidor, responsvel por fornecer a funcionalidade


bsica do CORBA para o servidor.
_correioStub.java

Esta classe o stub do cliente, responsvel por fornecer a funcionalidade bsica


do CORBA para o cliente.
correioHelper.java

Esta classe fornece operaes auxiliares, como a operao narrow(),


necessria para fazer o cast de uma referncia de objeto CORBA para o tipo correio.

correioHolder.java

Esta classe fornece operaes para argumentos do tipo out e inout.


Restando ento implementar os cdigos para os mtodos da interface correio
(correioImpl.java) definidos na IDL, e os cdigos do Servidor (Servidor.java)
e do Cliente (Cliente.java)

Implementaes
Todas os cdigos utilizados neste tutorial esto neste documento como anexos.

Implementaoda Inteface(correioImpl.java)
A classe correioImpl deve implementar todos os mtodos da interface correio.
Cada instncia de correio implementada pela correioImpl. O mtodo enviar_msg
possui como parmetro uma estrutura (definida na IDL e que mapeada para uma classe em
Java) mensagem.

Implementaodo Servidor(Servidor.java)
A implementao do servidor deve:

Iniciar o ORB;

4
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Criar uma instncia da implementao do objeto CORBA correio

Transformar o objeto em uma referncia para objeto CORBA;

Obter a referncia do servio de nomes;

Registrar o novo objeto no servidor servio de nomes, usando por exemplo o


nome Servidor-email;

Aguardar pelas invocaes dos clientes ao objeto.

Implementaodo Cliente(Cliente.java)
A implementao do cliente deve:

Inicializar o ORB;

Obter a referncia do servio de nomes;

Procurar pelo objeto que tenha sido registrado com o nome "Servidor-email" no
servio de nomes e recuperar a referncia do objeto;

Converter o objeto para o tipo de sua interface (correioHelper.narrow(obj));

Invocar os mtodos no objeto.

Compilando e executando o exemplo


Para que seja possvel compilar e executar o exemplo importante que o ambiente j esteja
preparado, ou seja, que todas as variveis de ambientes necessrias j tenham sido configuradas.
Todos os passos para preparao do ambiente no LCMI so descritos no documento
guialocal.pdf que pode ser obtido em: http://www.das.ufsc.br/~emerson/java-corba ,
juntamente com os cdigos fontes do exemplo descrito aqui.

Compilando a IDL:
$ idl tutorial.idl

Compilando os arquivos .java:


5
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

$ javac tutorial/*.java

Iniciando o servio de nomes (NS)


$ ns

Executando o servidor
Abra uma nova shell:
$ jaco tutorial.Servidor

Executando o cliente
Abra uma nova shell
$ jaco tutorial.Cliente

6
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Anexos
Arquivo: tutorial.idl
// Arquivo IDL
/*
Descrio:
Um sistema para envio de mensagens contendo um emissor,
destinatario,
um assunto e a mensagem propriamente dita.
*/
module tutorial{
struct mensagem{
string emissor;
string destinatario;
string assunto;
string corpo;
};
interface correio{
string enviar_msg(in mensagem email);
};
};

Arquivo: correioImpl.java
package tutorial;
public class correioImpl extends correioPOA{
// Constructor
correioImpl(){
System.out.println("Objeto correio criado com sucesso !");
}
public String enviar_msg(mensagem email) {

7
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


System.out.println("\n...::: Recebimento de mensagem :::...
\n");
System.out.println("De:
"+email.emissor);
System.out.println("Para: "+email.destinatario);
System.out.println("Assunto: "+email.assunto);
System.out.println("Mensagem: "+email.corpo);
System.out.println("...::: Fim da mensagem :::...");
return("Mensagem enviada com sucesso");
}

Arquivo: Servidor.java
package tutorial;
import org.omg.CosNaming.*;
class Servidor{
static public void main(String[] args){
try {
// Inicia o ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
// Pega a referencia do POAManager e o inicializa
org.omg.PortableServer.POA rootpoa =
org.omg.PortableServer.POAHelper.narrow
(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// Cria o objeto
correioImpl objCorreio = new correioImpl();
// Transforma o objeto local em uma referencia CORBA
org.omg.CORBA.Object ref = rootpoa.servant_to_reference
(objCorreio);
correio correioRef = correioHelper.narrow(ref);
// Obtem a referencia do servico de nomes
org.omg.CORBA.Object nsRef = orb.resolve_initial_references
("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow
(nsRef);
// Faz a ligao (bind) do objeto ao nome no servio de
nomes
NameComponent [] name = new NameComponent[1];
name[0] = new NameComponent("Servidor-Correio", "");

8
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


ncRef.rebind(name, correioRef);
// Executa o ORB e fica aguardando pelas invocacoes dos
clientes
System.out.println("Servidor de Correio iniciado com
sucesso....\n\n");
orb.run();
}catch (Exception e) { //Caso ocorra algum erro
System.err.println("ERROR: " + e);
}
}

Arquivo: Cliente.java
package tutorial;
import org.omg.CosNaming.*;
class Cliente{
static correio objCorreio;
static public void main(String[] args){
try {
// inicializa o ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
// Obtem a referencia do servico de nomes
org.omg.CORBA.Object nsRef = orb.resolve_initial_references
("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow
(nsRef);
// Busca pelo nome no servio de nomes
NameComponent [] name = new NameComponent[1];
name[0] = new NameComponent("Servidor-Correio", "");
org.omg.CORBA.Object objRef = ncRef.resolve(name);
// Converte o objeto para o tipo da interface correio
objCorreio = correioHelper.narrow(objRef);

//Chama o menu interativo


menu();
}catch(Exception e) { //Em caso de algum erro

9
http://www.das.ufsc.br/~fabio/java-corba/

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


System.err.println("\n\n Atencao - Nao foi possivel enviar a
mensagem");
System.err.println("System Exception: "+e);
}
}
public static void menu(){
java.io.BufferedReader teclado = new java.io.BufferedReader(new
java.io.InputStreamReader(System.in));
String linha = "";
try{
while (!linha.equals("2")) {
System.out.println("\n..:: Correio eletronico ::..\n");
System.out.println("1 - Enviar nova mensagem");
System.out.println("2 - Sair\n");
System.out.print("Entre com a opcao: ");
try{
linha = teclado.readLine();
}catch(java.io.IOException e){
System.err.println("ERRO DE IO: "+e);
}
if (linha.equals("1")){
mensagem msg = new mensagem();
System.out.print("\nDe: ");
msg.emissor = teclado.readLine();
System.out.print("Para: ");
msg.destinatario = teclado.readLine();
System.out.print("Assunto: ");
msg.assunto = teclado.readLine();
System.out.print("Corpo: ");
msg.corpo = teclado.readLine();
// Invocacao do metodo enviar_msg;
System.out.println(objCorreio.enviar_msg(msg));
}
}
}catch(Exception e){
System.err.println("System Exception: "+e);
}
}

10
http://www.das.ufsc.br/~fabio/java-corba/

Você também pode gostar