• No results found

Drøfting av antall løsninger av et likningssystem

In document John Haugan (sider 79-92)

A plataforma JGroups [Ban11] oferece um sistema de comunicação fiável baseado em di- fusão de mensagens. Esta plataforma oferece uma API disponível na linguagem de pro- gramação Java.

O sistema de comunicação fiável presente no JGroups, tem como ponto de partida o protocolo IP multicast e estende esse protocolo em dois aspectos: fiabilidade e modelo de grupos.

Um ponto forte desta plataforma é a personalização da pilha dos protocolos de co- municação, sendo possível escolher quais os protocolos que se pretende utilizar na apli- cação que se está a desenvolver sobre esta plataforma, por exemplo, relativamente ao tratamento de falhas nas comunicações, à fragmentação de mensagens e à política de ordenação de mensagens, por exemplo, causal, total ou FIFO.

De seguida, apresentam-se algumas primitivas de comunicação e exemplos de utili- zação dessas primitivas.

3.2.1.1 Channel

A comunicação na plataforma JGroups baseia-se no conceito de Channel (canal). Listing 3.1: Utilização de canais na plataforma JGroups

1 Channel c = new JChannel("stack.xml"); 2 c.connect("Group");

3 Message msg = new Message(null, null, "Hello World"); 4 c.send(msg);

5 msg = c.receive(0); 6 c.disconnect(); 7 c.close();

Um processo pode definir vários canais. Cada canal tem um endereço único e uma definição da pilha de protocolos que o canal tem de respeitar. Para criar um canal, basta instanciar um objecto do tipo JChannel, passando como argumento a definição da pilha de protocolos, sendo esta definição efectuada através de um documento XML ou de uma String.

De forma a ilustrar a utilização de canais, apresenta-se a listagem de código3.1que contém um exemplo de utilização de canais. Após a criação de um canal (linha 1), é possível ligá-lo a um grupo, de forma a que este participante fique como membro desse grupo. Para ligar a um grupo, basta utilizar a primitiva connect (linha 2), passando como

argumento qual o nome do grupo a que este canal fica associado. Os grupos não neces- sitam de ser criados explicitamente: a criação dos mesmos ocorre quando um canal se tenta ligar a um grupo que ainda não existe.

O envio e recepção de mensagens são efectuados de forma explícita, existindo primi- tivas para o envio (send) e para a recepção de mensagens (receive).

De forma a enviar uma mensagem, basta instanciar um objecto do tipo Message (linha 3) e enviá-lo através da primitiva send (linha 4), sendo que esta instanciação do objecto do tipo Message recebe os seguintes argumentos:

receiver address, indica qual o endereço para o qual se pretende enviar a mensa-

gem; caso se pretenda enviar a mensagem para todos os membros desse grupo, basta submeter null neste argumento;

sender address, indica qual o endereço do remetente; caso este argumento seja null,

significa que a pilha de protocolos é responsável por preencher este campo com o valor correcto;

byte buffer, indica o conteúdo da mensagem a enviar.

A recepção de uma mensagem é efectuada através da primitiva receive (linha 5), sendo a invocação da mesma bloqueante. Também é disponibilizada a primitiva peek, que per- mite a recepção de mensagens de forma não bloqueante.

Para sair de um grupo, é disponibilizada a primitiva disconnect (linha 6), que efectua a saída do grupo. Caso se pretenda fechar um canal, por exemplo porque o canal não vai ser mais utilizado ao longo do programa, é disponibilizada a primitiva close (linha 7).

A plataforma mantém a consistência do estado do grupo (suporta o modelo de sincro- nia virtual), notificando todos os membros quando existe alguma modificação na consti- tuição do grupo.

3.2.1.2 Building blocks

Os canais presentes na plataforma JGroups apresentam primitivas de baixo nível e de acesso directo aos protocolos de comunicação. É possível definir building blocks, que ofe- recem uma abstracção de mais alto nível ao programador, e utilizam internamente os canais presentes na plataforma.

A título de exemplo, apresenta-se a listagem de código3.2, que utiliza o building block RcpDispatcherdisponibilizado pela plataforma. Essa classe possibilita a invocação de mé- todos remotos (Remote Procedure Call), de forma colectiva.

Listing 3.2: Utilização de building blocks na plataforma JGroups

1 public class RpcDispatcherTest { 2 public int print(int number) {

3 return number * 2;

4 }

6 public void start() throws Exception { 7 Channel c = new JChannel("stack.xml");

8 RpcDispatcher disp = new RpcDispatcher(c, null, null, this); 9 c.connect("Group");

10 RspList rsp_list = disp.callRemoteMethods(null, "print", new Integer(i), GroupRequest.GET_ALL, 0);

11 c.close();

12 }

13 }

A utilização do building block é alcançada através da instanciação de um objecto do tipo RcpDispatcher (linha 8). Quando se instancia esse objecto, é necessário indicar qual é o canal a que fica associado, sendo que esse canal será posteriormente ligado a um grupo. Todas as invocações remotas são executadas através desse objecto, sendo disponibi- lizada a função callRemoteMethods (linha 10), onde é necessário indicar qual a função a executar e os parâmetros que se pretende passar na invocação. O resultado dessa função contém a invocação dessa função nos membros desse grupo.

A classe RcpDispatcherTest define uma função de exemplo print (linha 2 a 4), que recebe um número como argumento e devolve o dobro desse número. No exemplo apresentado, é invocada remotamente a função print em todos os membros do grupo Group.

3.2.1.3 Conclusão

A plataforma JGroups tem uma implementação robusta e oferece flexibilidade ao progra- mador, pois é possível definir a configuração da pilha dos protocolos de comunicação. Esta plataforma é indicada para o desenvolvimento de aplicações complexas, nomeada- mente que exijam semânticas de consistência, por exemplo, como o modelo de sincronia virtual.

No entanto, para os objectivos do trabalho que se apresenta nesta dissertação, e face às características das aplicações como os jogos colaborativos, torna-se mais adequada uma plataforma que suporte grupos de forma simples e flexível, inclusivamente relativa- mente ao suporte de diferentes dispositivos computacionais e à sua fácil integração num ambiente de execução.

In document John Haugan (sider 79-92)