DEL 3 • ARBEID, VELFERD OG MILJØ
2.5 Internasjonalisering og regionalisering av økonomien. 20
Após uma análise dos diferentes mecanismos de interacção do modelo, observou-se que cada um deles possui efectivamente características e funcionalidades desejáveis para criar uma plataforma com as infraestruturas necessárias ao desenvolvimento de uma implementação do modelo MAGO. A opção tomada foi a de escolher uma plata- forma que tornasse disponível uma camada intermédia que cumprisse o maior número de requisitos de base do modelo. A escolha recaiu no sistema JGroupSpaces, um sis- tema desenvolvido no grupo [Cus08].
O JGroupSpace, que assenta no modelo GroupLog, tem disponível um conjunto de primitivas para a gestão dinâmica de grupos e para a interacção baseadas em troca de mensagens, espaço partilhado de tuplos e eventos (5.3). A concepção das funci- onalidades a integrar no JGroupSpace foi, ela própria, influenciada pelos requisitos da definição do modelo MAGO, em particular no que se refere às funcionalidades de suporte a eventos e a espaço de tuplos.
No sistema JGroupSpace um processo é uma entidade activa que executa um pro- grama Java e que, tendo acesso a uma biblioteca oferecida pelo sistema, pode integrar- se em grupos de processos [Cus08].
As funcionalidades estão disponibilizadas através de uma interface de programa- ção (API) em Java e estão separadas em quatro categorias principais:
• Acesso ao grupo: os grupos são criados de forma explícita quando um processo invoca a primitiva de filiação, os grupos são identificados por um identificador global. As primitivas que permitem a entrada, saída e obtenção da constituição de um grupo são:
ARQUITECTURA DE SUPORTE AO MODELO
Figura 5.3:Visão de um grupo no JGroupSpace [Cus08]
– JGSAddress join(String group_name)
Junta um processo a um grupo identificado por group_name; se o grupo ainda não existir é criado quando da filiação do primeiro membro;
– void leave()
O processo invocador sai do grupo;
– JGSMembership getMembership()
Depois de um processo se juntar a um grupo, é possível obter informação sobre a constituição deste, ou seja dos membros que actualmente se encon- tram filiados.
• Envio e recepção de mensagens: os processos presentes num grupo podem co- municar directamente com os outros membros através de mensagens. As primi- tivas para a comunicação por mensagens são:
– void send(JGSMessage msg)
Envia uma determinada mensagem no contexto do grupo. Na mensagem, são especificados, a mensagem, os endereços do emissor e do receptor, note- se que, caso não seja especificado o receptor, a mensagem é enviada para todo o grupo;
– JGSMessage receive(int timeout)
Recebe uma mensagem proveniente do grupo. Opcionalmente pode ser in- dicado um timeout, especificando o período de tempo que o processo deve aguardar pela recepção da mensagem. Caso esse timeout seja 0 e não exista nenhuma mensagem pendente para ser recebida, a primitiva bloqueia até receber uma mensagem.
• Envio e recepção de eventos: os processos presentes num grupo podem comu- nicar de forma assíncrona através de eventos. Os eventos são enviados por um
ARQUITECTURA DE SUPORTE AO MODELO
membro do grupo e têm como destino todos os membros do grupo, no entanto, serão somente notificados do evento, aqueles que tenham definido um handler;
– void setEventHandler(JGSEventHandler handler)
Permite definir um handler para o tratamento de eventos emitidos pelo grupo. Depois de definido, todos os eventos difundidos nesse grupo se- rão recebidos localmente no processo, através da chamada assíncrona do handler;
– JGSEventHandler getEventHandler()
Permite obter o handler definido para o tratamento de eventos emitidos pelo grupo;
– void sendEvent(java.io.Serializable obj)
Envia um evento com um determinado objecto (ob j) para o grupo.
• Espaço de tuplos partilhado: as primitivas para interacção através do espaço partilhado de tuplos associado ao grupo, são baseadas no modelo Linda:
– Tuple out(Tuple t)
Insere um dado tuplo no espaço partilhado do grupo, podendo o tuplo não se encontrar totalmente instanciado. Após esta operação o tuplo fica dispo- nível no espaço partilhado e acessível aos restantes membros;
– void in(Tuple t)
Remove um tuplo do espaço partilhado do grupo, esta primitiva devolve um tuplo existente no espaço compatível com o tuplo dado como argu- mento. Caso não exista nenhum tuplo compatível bloqueia até esse tuplo existir;
– Tuple inp(Tuple t)
Primitiva idêntica à anterior, mas não bloqueia, ou seja, retorna imediata- mente no caso de não existir um tuplo compatível;
– Tuple rd(Tuple t)
Lê um tuplo do espaço partilhado do grupo mas sem o remover. Tal como nas primitivas anteriores, devolve tuplo compatível com o tuplo passado como argumento. Caso não exista nenhum tuplo compatível, bloqueia até esse tuplo existir;
– Tuple rdp(Tuple t)
Versão não bloqueante da primitiva rd;
– Vector rdpall()
Devolve um vector com todos os tuplos que existem no espaço partilhado do grupo.
ARQUITECTURA DE SUPORTE AO MODELO
A representação de um processo Java, num grupo de processos é realizada através de um objecto da classe JGroupSpace, ou seja por cada grupo a que o processo se pre- tenda filiar, deve ser instanciado um objecto desse tipo. Na figura 5.4 pode observar-se como é modelada a situação em que um processo pertence a dois grupos distintos.
Figura 5.4: Exemplo de um processo Java que pertence a dois grupos [Cus08]
Cada grupo, no sistema JGroupSpace, é identificado por um nome (String) definido quando da operação de join. Como resultado desta operação é devolvido um objecto da classe JGSAddress, que permite identificar o processo dentro do grupo, essa classe constitui um encapsulamento de um endereço IP e de uma porta de ligação4.