Descrição
Nessa aula será
apresentado um exemplo de utilização de memória compartilhada distribuída. Usaremos o JavaSpaces,
que é parte integrante da tecnologia Jini. Utilizaremos uma
implementação gratuita e de código aberto do Jini, chamada Apache River.
Roteiro
Efetue o
download do Apache River 2.2 e o instale no
seu computador, extraindo o conteúdo do arquivo em um diretório no qual você
possua permissão de escrita.
O código
da aplicação de exemplo encontra-se dentro da pasta de instalação do Apache
River, no diretório examples/space. Utilizaremos uma classe auxiliar para
conectar ao serviço JavaSpace, chamada Lookup.
Definindo o Formato das Mensagens
Os objetos
publicados no espaço de tuplas devem implementar a interface net.jini.core.entry.Entry.
A classe Message,
mostrada abaixo, contém apenas um atributo do tipo String, que
corresponde ao conteúdo da mensagem. Outros atributos e métodos podem ser
definidos quando necessário.
import net.jini.core.entry.Entry; public class Message implements Entry { public String content; public Message() { } }
Escrevendo no Espaço de Tuplas
A classe WriteMessage
permite que sejam digitadas mensagens que serão escritas no espaço de tuplas.
O tempo de vida das mensagens é de um minuto.
import net.jini.space.JavaSpace; import java.util.Scanner; public class WriteMessage { public static void main(String[] args) { try { System.out.println("Procurando pelo servico JavaSpace..."); Lookup finder = new Lookup(JavaSpace.class); JavaSpace space = (JavaSpace) finder.getService(); if (space == null) { System.out.println("Serviço JavaSpace nao encontrado. Encerrando..."); System.exit(-1); } System.out.println("O servico JavaSpace foi encontrado."); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("Entre com o texto da mensagem (ENTER para sair): "); String message = scanner.nextLine(); if (message == null || message.equals("")) { System.exit(0); } Message msg = new Message(); msg.content = message; space.write(msg, null, 60 * 1000); } } catch (Exception e) { e.printStackTrace(); } } }
Lendo Mensagens do Espaço de Tuplas
A classe ReadMessage
remove mensagens escritas no espaço de tuplas e as imprime na tela. O tempo
de espera máximo é de um minuto.
import net.jini.space.JavaSpace; public class ReadMessage { public static void main(String[] args) { try { System.out.println("Procurando pelo servico JavaSpace..."); Lookup finder = new Lookup(JavaSpace.class); JavaSpace space = (JavaSpace) finder.getService(); if (space == null) { System.out.println("Servico JavaSpace nao encontrado. Encerrando..."); System.exit(-1); } System.out.println("O servico JavaSpace foi encontrado."); while (true) { Message template = new Message(); Message msg = (Message) space.take(template, null, 60 * 1000); if (msg == null) { System.out.println("Tempo de espera esgotado. Encerrando..."); System.exit(0); } System.out.println("Mensagem recebida: "+ msg.content); } } catch (Exception e) { e.printStackTrace(); } } }
Compilando e Executando a Aplicação
Primeiramente
você deve se certificar de que os serviços do Apache River estejam em
execução. Isso é feito executando os seguintes comandos a partir do diretório
de instalação do Apache River:
cd examples/space ./start-services.sh
Obs.: No Windows,
troque ‘/’ por ‘\’ e ‘.sh’ por ‘.bat’.
Caso
esteja usando uma IDE, adicione as seguintes bibliotecas ao projeto,
contidas na pasta ‘lib’ do diretório de instalação do Apache River:
jini-core.jar jini-ext.jar reggie.jar outrigger.jar
Feito
isso, basta compilar o projeto, executar primeiramente a classe ReadMessage,
em seguida executar a classe WriteMessage e entrar com as mensagens de
texto que serão enviadas para o espaço de tuplas.
Caso
não esteja usando uma IDE, execute o script:
./compile-app.sh
Para
testar o programa, execute a classe ReadMessage em um terminal/prompt
de comando:
./start-reader.sh
Em
seguida, execute a classe WriteMessage em outro terminal/prompt de
comando:
./start-writer.sh
Trabalho
2
O trabalho a ser realizado consiste em criar um servidor
de licenças de software.
Suponha que uma determinada empresa adquiriu 5 licenças
de um compilador, mas que 100 usuários poderão se revezar na utilização das
licenças. Um servidor de licenças ficará responsável por armazenar as 5
licenças e alocá-las para os usuários quando estes forem fazer uso do
compilador.
O servidor de licenças deve ser construído utilizando uma
das seguintes tecnologias, a sua escolha:
· Objetos
Distribuídos (Java RMI ou CORBA)
· Web
Services
· P2P
· MOM
· DSM
Cada usuário que acessar o sistema poderá executar as
seguintes ações:
· acquire:
solicita uma licença para uso durante 1 minuto (aguarda caso não haja uma
licença disponível);
· renew:
renova uma solicitação de licença por mais 1 minuto;
· release: devolve a licença
ao servidor após sua utilização.
Se uma licença não for renovada ou devolvida após 2
minutos, o servidor de licenças deve assumir que ocorreu uma falha no
computador do usuário, e deve liberar a licença para uso de outro usuário.
Todas as ações acima devem ser registradas na tela pelo
programa. Para que seja possível testar o funcionamento do servidor de
licenças, implemente um programa cliente que simule o papel do compilador,
executando as três ações previstas na especificação do servidor.
Avaliação
A
atividade deve ser desenvolvida em duplas. A apresentação deve ser feita até
o dia 12/11. Os dois integrantes do grupo devem estar presentes no
momento da apresentação. Será verificado o funcionamento do programa e em
seguida os alunos devem responder oralmente a questões formuladas pelo
professor sobre o código fonte do programa. Podem ser atribuídas notas
diferentes aos integrantes de um grupo, dependendo das respostas às perguntas
sobre o código do programa efetuadas pelo professor. Caso um dos alunos não
esteja presente ou demonstre não conhecer o código do programa, este ficará
com nota zero na atividade. Em caso de cópia do código de outro grupo, ambos
terão nota igual a zero.
Dúvidas?
Atendimento
aos Alunos
- Horário:
Terças-feiras das 16:20 às 18:00.
- Local:
Prédio do INE - Sala 305.
E-Mail
f r a n k @ i n f . u f s c . b r
Mantida
por Frank Siqueira. Atualizada
em 04/11/2012.
|