• Nenhum resultado encontrado

4.2 A plataforma JADE

4.2.4 Mensagens em JADE

Sistemas baseados em agentes possuem intrinsecamente uma arquitetura peer-to-peer, onde cada agente é um software executando em um nó da rede. Os agentes necessitam iniciar comunicação com outros agentes, sendo capazes de prover serviços a eles. Isso torna o papel da comunicação em sistemas baseados em agentes muito importante. O modelo de comunicação em JADE é fundamentado em três características principais [Bellifemine04]:

ƒ Agentes são entidades ativas, elas podem responder “não” e são fracamente acopladas. O grau de dependência entre os agentes é minimizado porque a plataforma permite que o agente escolha de forma flexível os destinatários das mensagens que deseja enviar. Além do mais, cada agente decide que mensagens ele quer interpretar ou descartar, também podendo, por exemplo, controlar o seu ciclo de execução para aguardar respostas a mensagens que enviou.

ƒ Agentes realizam ações e a comunicação é considerada com apenas mais um tipo de ação. Isso quer dizer que os agentes tanto podem realizar ações físicas quanto ações comunicativas e, com respeito a essas ações, também podemos ter o planejamento da comunicação. Tornar possível este planejamento traz à tona a necessidade de definir claramente efeitos e pré- condições associados a cada comunicação possível.

ƒ A comunicação traz consigo um significado semântico. Quando um agente é objeto de uma ação comunicativa recebendo uma mensagem, ele deve ser capaz de compreender o significado desta ação e qual a intenção comunicativa do agente que enviou a mensagem. Por isso a necessidade de uma semântica universal e a necessidade de um padrão de comunicação.

JADE é compatível com o padrão da FIPA definido para resolver a necessidade de comunicação e sociabilidade dos agentes, a Linguagem de Comunicação de Agentes (ACL – Agent Communication

Language) [FIPA00]. O padrão FIPA-ACL é baseado na teoria dos atos de fala [Russel02] e nessas

três características descritas acima.

Figura 4.5: Componentes do modelo de comunicação da FIPA

Diversos padrões de comunicação comuns foram definidos pela FIPA e são denominados de protocolos de interação. Esses protocolos podem ser utilizados para conseguir realizar tarefas comuns, como por exemplo delegar uma ação, realizar uma chamada de propostas, entre outras. A Figura 4.5 representa o modelo de comunicação definido pela FIPA e adotado por JADE, como também os relacionamentos existentes entre os elementos que compõe este modelo.

Na comunicação entre agentes na plataforma JADE, os agentes se comunicam enviando mensagens individuais uns para os outros através de passagem assíncrona de mensagens ACL. Os

agentes interpretam as mensagens como atos de fala, e não como chamadas, bem como JADE codifica as mensagens trocadas pelos agentes de forma transparente para o desenvolvedor. O padrão FIPA define que somente mensagens ACL são transportadas na plataforma, porém não define nenhum padrão para o conteúdo das mensagens.

A classe ACLMessage representa as mensagens seguindo as especificações da FIPA [FIPA00].

Na Figura 4.6 é apresentada uma estrutura de mensagem ACL. Nela, todos os parâmetros são pares representados por uma palavra-chave e um valor. Os valores dos parâmetros podem ser inseridos através dos métodos set() e podem ser lidos através de métodos get(), como exemplo podemos utilizar os métodos setContent() e getContent() para inserir ou capturar o valor do parâmetro content, respectivamente.

Todas as performativas da FIPA para atos de comunicação são identificadas na mensagem ACL por constantes, por exemplo: ACCEPT_PROPOSAL, AGREE, CANCEL, CFP, CONFIRM, etc. Essas constantes são referenciadas no construtor da classe com o objetivo de definir o tipo de mensagem.

Figura 4.6: Exemplo de mensagem de acordo com o padrão ACL

Para que um agente envie mensagens a outros, o desenvolvedor deve instanciar um objeto da classe ACLMessage, preencher a mensagem com as informações necessárias em cada campo correspondente e chamar o método send() da classe Agent. Quando o agente quiser receber as mensagens, deve chamar o método receive() ou blockingReceive() da classe Agent. Outra forma de enviar ou receber mensagens em JADE é através do uso das classes de comportamentos próprios para ações comunicativas: SenderBehaviour e ReceiveBehaviour. O uso dessas duas classes torna possível que as trocas de mensagens possam ser escalonadas como atividades independentes.

A seguir são listados alguns métodos importantes da classe ACLMessage:

ƒ public void addReceiver(AID idAgente): adiciona o AID de um agente como receptor ou destinatário da mensagem ACL, determinando quem receberá a mensagem;

ƒ public void removeReceiver(AID idAgente): remove um determinado AID da lista de receptores;

QUERY-IF

:sender agencia@G6C15:1099/JADE

:receiver empregador@G6C15:1099/JADE

:protocol fipa-query :conversation_id C2471722_1067382505429 :reply_with :reply_by :language fipa-sl0 :ontology employment-ontology :content ((TRABALHA-PARA

(PESSOA :nome “Maria”

:idade 23

:endereco (ENDERECO

:rua “Rua da Aurora" :numero 15

:cidade Recife)) (EMPRESA :nome “BOMPREÇO”

:endereco (ENDERECO :rua “17 de Agosto" :numero 200 :cidade Recife)))) PERFORMATIVA PERFORMATIVA ENDEREÇAMENTO ENDEREÇAMENTO COMUNICAÇÃO COMUNICAÇÃO MENSAGEM MENSAGEM

ƒ public ACLMessage createReply(): cria uma nova mensagem ACL em resposta à determinada mensagem;

ƒ public static java.lang.String[] getAllPerformativeNames(): retorna um array de strings com todas as performativas que podem ser utilizadas em JADE;

ƒ public Iterator getAllReceiver(): retorna um iterator contendo todos os AIDs dos agentes receptores da mensagem;

ƒ public java.lang.String getContent(): retorna uma string contendo o conteúdo da mensagem. ƒ public void setContent(java.lang.String conteudo): define o conteúdo da mensagem a ser

enviada.

ƒ public void setOntology(java.lang.String ontologia): define a ontologia que a mensagem respeita;

ƒ public void setPerformative(int performativa): define a constante recebida como parâmetro para ser a performativa da mensagem ACL.

JADE também permite que não só strings sejam transmitidas no conteúdo de mensagens, mas também outros objetos Java. O método setContentObject() da classe ACLMessage permite definir como conteúdo de uma mensagem um objeto Java do tipo java.io.Serializable. Este objeto pode ser recuperado no recebimento da mensagem através do método getContentObject(). Contudo, esses métodos não estão em conformidade com as especificações da FIPA, uma vez que ela estabelece que todas as trocas de mensagens entre agentes devem estar baseadas em texto.