DAS 5315 - Sistemas Distribuídos para Automação Industrial Trabalho 1º Semestre 2014 Professor: Joni da Silva Fraga Doutorando: Luciano Barreto DAS5315 - Sistemas Distribuídos 1 Objetivos • Aplicar os conceitos aprendidos na disciplina – Threads – Concorrência – Objetos remotos – Comunicação entre processos • Implementação de uma aplicação utilizando mecanismos de invocação remota de métodos DAS5315 - Sistemas Distribuídos 2 Descrição • Controle de Silos de Armazenamento e Escoamento • • Um controlador deve distribuir os abastecimentos entre os 5 silos Esse controlador recebe informações de recebimento de grãos e faz a leitura de sensores de quantidade nos silos para tomar a decisão de qual silo abastecer Lê sensores dos silos Recebe abastecimento Controlador Silo 01 Obj_S1 Silo 02 Obj_S2 Silo 03 Obj_S3 Silo 03 Obj_S4 Silo 4 Obj_S5 Decide em qual silo armazenar DAS5315 - Sistemas Distribuídos 3 Especificações • Silos • Os silos tem uma capacidade limitada • Há uma vazão dos grãos dos silos • O abastecimento do silo deve levar em conta a sua capacidade de armazenamento • Valor Máximo Abast = Capacidade do Silo – Utilização • Caso a quantidade de abastecimento não caiba em um silo a mesma deve ser distribuída nos demais • O valor em espera pode ser armazenada em uma variável de estocagem DAS5315 - Sistemas Distribuídos 4 Especificações • Controlador • Recebe informações de abastecimento • Deve distribuir o abastecimento entre os silos, de forma que o silo com menor quantidade de grãos receba esse abastecimento (total ou parcial) • O controlador pode receber quantidades variáveis de abastecimento, dessa forma pode ocorrer de uma certa quantidade de grãos ficar em espera pois nenhum silo comporta • Aguardando escoamento DAS5315 - Sistemas Distribuídos 5 Especificações • Os sensores dos silos podem falhar, caso isso ocorra o controlador deve desativar esse silo da lista – Avisar o controlador do problema e exibir uma mensagem • O valor que está neste silo quando ocorreu a falha no sensor é descartado DAS5315 - Sistemas Distribuídos 6 Implementação • Os silos são implementados em processos sendo executados em diferentes locais como objetos remotos • Esses processos devem oferecer um método remoto chamado: • Ler_Sensor() que irá retornar a quantidade atual armazenada no silo • Abastece_Silo() que envia uma quantidade para o abastecimento • Os silos tem uma capacidade inteira de 50 unidades • A variável que controla a quantidade atual do silo deve ser decrementada randomicamente em tempo e em quantidade simulando o escoamento • Tempo variando entre 1 e 3 segundos com saída entre 5 e 50 quilos DAS5315 - Sistemas Distribuídos 7 Implementação • As leituras dos sensores devem manter um contador para saber qual a quantidade dos silos no momento das leituras – O controlador pode manter esses contadores atualizados a cada 2 segundos • ** Informar manualmente em qualquer um dos processos (exceto do controlador) o valor -1 na variável utilizada pelo sensor para simular defeito DAS5315 - Sistemas Distribuídos 8 Implementação • O controlador recebe as quantidades de abastecimento – O sistema deverá receber a leitura pelo teclado, podendo ser informada diversas vezes. • As quantidades recebidas são esporádicas (somente quando informadas manualmente), mas o processo de leitura/abastecimento deve ser automático DAS5315 - Sistemas Distribuídos 9 Implementação • A interação só será iniciada quando todos os processos tiverem registrado seus objetos remotos – Inicia-se todos os silos, depois o controlador é iniciado – Verificar utilizando a leitura das IOR • Todos os silos começam com quantidade atual = 0 DAS5315 - Sistemas Distribuídos 10 Implementação • Os abastecimentos e as leituras dos sensores devem ser armazenadas em um log – Um arquivo .txt deverá ser utilizado para isso. Sempre que houverem leituras pelo controlador e abastecimentos pelos silos o evento deverá ser armazenado no log com a data e hora atual • Os LOGs devem ser individuais de cada processo, utilizando estampas de tempo (14:00:00 – Leitura Silo 1 – 20; 14:00:01 – Abastecimento Silo 1 – Valor – 30) • Mostrar na tela do controlador quando um sensor está com problema DAS5315 - Sistemas Distribuídos 11 Implementação • Os valores dos sensores, abastecimentos e leituras devem ser mostrados no dispositivo de saída padrão (tela) • Utilizar threads para leituras e escritas tanto nos sensores quanto no controlador • Lembrar que objetos podem ser concorrentes – Usar métodos que levem em conta a sincronização DAS5315 - Sistemas Distribuídos 12 Ferramentas • Linguagem de programação Java. – Core Java, Vol. I (Fundamentals). Cay S. Horstmann, Gary Cornell. – Core Java, Vol. II (Advanced Features). Cay S. Horstmann, Gary Cornell. • CORBA – Java Programming With Corba. Andreas Vogel, Keith Duddy. DAS5315 - Sistemas Distribuídos 13 Dicas • Utilizar estruturas de dados do Java tais como – ArrayList para métodos que a sincronia não importa – Vector para métodos que a sincronia é importante • Thread-safe – TreeSet/TreeMap já armazena ordenado • Bom quando se precisa saber qual o maior ou menor valor, por exemplo http://www.caelum.com.br/apostila-java-orientacaoobjetos/collections-framework/#16-11-mapas-java-util-map DAS5315 - Sistemas Distribuídos 14 Dicas Utilizar diferentes Threads para Diferentes Operações – Controlador – Silos • Thread que lê os sensores • Thread que recebe os abastecimentos • Thread que Adiciona Silos • ... • Thread que recebe abastecimento • Thread que recebe o alarme • ... Threads em Java são classes que implementam Runnable ou estendem Thread Lembrar de utilizar semáforos, singleton, etc.... http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/sincronizacao.html http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-semaphores.html http://wmagician.wordpress.com/2008/01/02/padrao-singleton-em-java/ DAS5315 - Sistemas Distribuídos 15 Dicas • Interface gráfica não é obrigatório, mas é bem vinda – NetBeans ou IntelliJ IDEA ajudam a desenvolver interfaces gráficas – Interfaces SCADA são interessantes • Modo texto é aceitável – Se feita de forma que se entenda o processo • Log em txt http://www.devmedia.com.br/criando-e-gravando-dados-em-txt-com-java/23060 http://mballem.wordpress.com/2011/03/21/manipulando-arquivo-txt-com-java/ DAS5315 - Sistemas Distribuídos 16 Dicas • Utilizar computadores diferentes não é obrigatório – Mas utilizar diferentes processos é • Não utilizar uma mesma classe Main para tudo • Fazer somente um código para o Silo – Utilizar a identificação do silo através de argumento java –jar silo.jar [1..N] public static void main (String[] args){ String id_Silo = args[0]; .... } DAS5315 - Sistemas Distribuídos 17 Dicas • Tentem apresentar fora da ferramenta que usaram para desenvolver (fica mais rápido e da menos confusão com os projetos) – Gerando pacotes jar • Netbeans http://dicaetuto.blogspot.com.br/2011/03/criando-um-arquivo-jar-nonetbenas-9x.html • Eclipse http://maguscode.blogspot.com.br/2010/08/gerar-jar-no-eclipse-e-executar.html • Para executar um jar use – java –jar pacote.jar [argumentos] DAS5315 - Sistemas Distribuídos 18 Dicas • Verificar se todos os objetos já foram registrados private static boolean isSynchronized(NamingContext nc) throws Exception { BindingListHolder bl = new BindingListHolder(); BindingIteratorHolder bi = new BindingIteratorHolder(); nc.list(99, bl, bi); Binding[] bindings = bl.value; return bindings.length == 5; } ..... org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext nc = NamingContextHelper.narrow(objRef); ... while (!isSynchronized(nc)); ... } .... DAS5315 - Sistemas Distribuídos 19 Avaliação • Grupo de 2 alunos • Enviar o nome da dupla e a data de apresentação o quanto antes • Os dois devem saber o que foi feito, um explica como funciona o controlador e outro o silo • Entrega até 18/07/2014 • Enviar código fonte em uma pasta com o nome da dupla • Mandar e-mail para marcar dia e horário • Apresentação será no LTIC • Dúvidas: [email protected] • www.das.ufsc.br/~lucianobarreto/ DAS5315 - Sistemas Distribuídos 20