Logo


Exemplo

 

Home Descricão
Download
MJacoAdmin
Exemplo
Publicações
 

Este projeto está hospedado no:
Hosted by:
SourceForge Logo

Última atualização: 22/02/2006 18:00

MJaco é um projeto do LCMI.
MJaco is a project of LCMI

Para implementar uma aplicação com suporte a grupo, é necessário executar os seguintes passos:

  1. Definir a IDL de seu objeto servidor;
  2. Compilar a IDL;
  3. Implementar o objeto servidor;
  4. Implementar o cliente;
  5. Usar os clientes.

1. Definição da IDL

Para o nosso exemplo, usaremos a seguinte IDL:

module electronicAgenda{

  struct Register{
  	string name;
  	string address;
  	string phone;
  };


  typedef sequence < Register > Registers;

  interface Agenda {
  	oneway void addRegister(in Register newReg);
  	oneway void removeRegister(in string name);
        Register searchRegister(in string name);
  	oneway void updateRegister(in string oldName,in Register update);
        Registers allRegisters();
  };
};

E salvaremos no arquivo electronicAgenda.idl.

2. Compilação da IDL

Para compilar esta IDL, execute o seguinte comando:

java -cp jacorb.jar jacorb.idl.parser electronicAgenda.idl
Parâmetros adicionais:
-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.

Para baixar o exemplo clique aqui.