-d <diretório onde serão colocados os arquivos compilados>
-W <nível de verbosity da saída>
-p <prefixo de package>
-i2jpackage <faz a tradução na forma idl_package:java_package>
-h <ajuda do compilador>
Se houver erros na compilação, verifique a documentação
do JacORB em www.jacorb.orb.
3. Implementação da IDL ( Implementação
do objeto servidor )
Para implementar a IDL, basta criar uma classe que herde de <nome
da interface>POA. No nosso exemplo, se trata da classe AgendaPOA.
public class AgendaImpl extends AgendaPOA {
}
A classe AgendaPOA já possui todos os métodos que
devem ser implementados. Ao estender esta classe, a classe AgendaImpl
vai ter os seguintes métodos:
public class AgendaImpl extends AgendaPOA {
public void addRegister(electronicAgenda.Register newReg){}
public void removeRegister(java.lang.String name){}
public electronicAgenda.Register searchRegister(java.lang.String name){}
public void updateRegister(java.lang.String oldName, electronicAgenda.Register update){}
public electronicAgenda.Register[] allRegisters(){}
}
Para criar o grupo fizemos uma classe separada:
import.......
public class Main {
private static short port = 8006;
private static String groupAddress = "225.12.13.14";
private static String groupDomain = "default";
public static void main(String[] args) throws Exception {
//cria o ORB
ORB orb = ORB.init((String[]) null, null);
//obtem as referencias iniciais
POA poa = (POA) POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
//ativa o POA
poa.the_POAManager().activate();
NamingContextExt nameService =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
//crio uma implementacao do objeto à registro e obtenho sua ref e id
AgendaImpl agendaServant = new AgendaImpl();
byte[] agendaId = poa.activate_object(agendaServant);
org.omg.CORBA.Object agendaRef = poa.id_to_reference(agendaId);
ObjectGroupFactory mgm =
ObjectGroupFactoryHelper.narrow(orb.resolve_initial_references("MGM"));
Agenda agendaGroup = null;
if (args.length == 1 && args[0].equals("createGroup")) {
//crio os criterios para inicializacao do grupo
Property[] criteria = new Property[4];
Any any = orb.create_any();
any.insert_Object(agendaRef);
criteria[0] =
new Property(
new NameComponent[] {
new NameComponent("org.omg.mgm.SupportImplicitOperations", null)},
any);
any = orb.create_any();
any.insert_short(port);
criteria[1] =
new Property(
new NameComponent[] {
new NameComponent("org.omg.mgm.ProtocolEndpointsIPPort", null)},
any);
any = orb.create_any();
any.insert_string(groupAddress);
criteria[2] =
new Property(
new NameComponent[] {
new NameComponent("org.omg.mgm.ProtocolEndpointsIPv4Address", null)},
any);
any = orb.create_any();
any.insert_string(groupDomain);
criteria[3] =
new Property(
new NameComponent[] { new NameComponent("org.omg.mgm.GroupDomainId", null)},
any);
agendaGroup =
AgendaHelper.narrow(
mgm.create_object(AgendaHelper.id(), criteria, new FactoryCreationIdHolder()));
NamingContext umiopCtx =
nameService.bind_new_context(nameService.to_name("umiop.context"));
umiopCtx.bind(nameService.to_name("genda.group"), agendaGroup);
} else {
agendaGroup =
AgendaHelper.narrow(nameService.resolve_str("umiop.context/Agenda.group"));
}
poa.associate_reference_with_id(agendaGroup, agendaId);
orb.run();
}
}
Antes de criar um grupo precisamos lançar um NameServer (Servidor
de Nomes), que serve para armazemar informações do grupo,
estas informações também podem ser armazenadas em
um arquivo como no exemplo do HelloWorld que vem junto com os arquivos
de instalação do MJaco.
Para rodar o servidor de nomes primeiramente devemos copiar o arquivo
.jacorb.properties para ~(home).
Este arquivo contém as definições de algumas propriedades,
entre elas:
ORBInitRef.NameService=URL onde serão armazenadas as informações
do grupo(também pode ser em arquivo).
Tendo o MJaco devidamente instalado setar a variável MJACO_HOME
= diretório onde foi instalado.
Rodar o servidor de nomes através do comando ns (ambiente Unix),
passando como parâmetro o local onde serão armazenadas as
informações, deve ter concistência com o que esta
definido na propriedade ORBInitRef.NameService.
Para criar um grupo já com um servidor (será o servidor
IIOP do grupo) basta digitar:
mjaco electronicAgenda.server.Main createGroup
Para lançar um novo servidor e cadastrá-lo ao grupo basta
digitar:
mjaco electronicAgenda.server.Main
4. Implementação do Cliente
Os clientes devem ser implementados da maneira convencional, sem nenhuma
preocupação com o código da infraestrutura MJaco,
apenas devemos "pegar" a referência do grupo:
No nosso exemplo:
import .....
public class Client {
Agenda agenda;
public Client() {
this.createAgenda();
GUIClient window = new GUIClient(this);
window.show();
}
public static void main(String[] args) {
Client c = new Client();
}
public void createAgenda() {
try {
ORB orb = ORB.init((String[]) null, null);
NamingContextExt nameService =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
this.agenda =
AgendaHelper.narrow(nameService.resolve_str("umiop.context/Agenda.group"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
As requisição, feita por um cliente, que exigirem resposta
serão enviadas para o representante IIOP do grupo, e as que não
exigem resposta serão enviadas para todos servidores devidamente
cadastrados no grupo. No entanto o programador não precisa se preocupar
com isto quando esta desenvolvendo sua aplicação, pois a
infra-estrutura MJaco gerencia para quem será enviada uma requisição.
Para lançar um cliente, com o servidor de nomes na ar, basta digitar:
mjaco electronicAgenda.client.Client
5. Usar os clientes
Os clientes podem ser usados de maneira transparente, sem ter conhecimento
do número ou localização exata dos objetos servidores.
Para todos os fins, existe apenas um servidor.