INE5418
Aula Prática – DSM

Prof. Frank Siqueira

Departamento de Informática e Estatística
Universidade Federal de Santa Catarina
 

INE5418 | Descrição | Roteiro | Trabalho 2 | Dúvidas


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.