• Nenhum resultado encontrado

Foram desenvolvidas duas vers˜oes de RME: uma vers˜ao para aplica¸c˜oes servidoras (Server_RME) e outra para aplica¸c˜oes clientes (Client_RME), que pode ser considerada um subconjunto da pri- meira vers˜ao citada. Os tamanhos dos pacotes cliente e servidor s˜ao, respectivamente, 37KB e 68KB. A vers˜ao cliente foi desenvolvida com o intuito de conter apenas os recursos impres-

Tipo dos Tamanho da Tipo de Tamanho da Best Effort At Most Once

Parˆametros Requisi¸c˜ao Retorno Resposta req/s req/s

empty 200 short 70 4081,73 4019,98 empty 200 char 70 4177,98 4128,81 empty 200 int 72 4133,94 4085,30 empty 200 long 76 4142,50 4092,66 empty 200 String 81 4058,98 4009,62 empty 200 String[] 201 3348,03 3319,61 byte,short,char, int,long,String, 351 void 69 3942,18 3869,97 String[] byte[] 213 String 82 3917,99 3859,81 short[] 223 String 82 3798,42 3725.23 char[] 223 String 90 3851,33 3818,83 int[] 243 String 82 3671,30 3627,92 long[] 283 String 82 2891,57 2847,06 String[] 323 String 170 3226,50 3082,23 Tabela 4.4: Compara¸c˜ao de desempenho entre semˆanticas de chamada remota.

cind´ıveis para a realiza¸c˜ao de chamadas remotas. Assim, tal pacote n˜ao cont´em, por exemplo, implementa¸c˜oes de classes tais como RmeRemoteObject, RmeRequestReceiver, RmeResponse- Sender, RmeSkeleton e TcpServerSocket.

Conforme tratado na Se¸c˜ao 4.2, a plataforma RME possui distribui¸c˜oes tanto para a edi¸c˜ao J2SE quanto para a edi¸c˜ao J2ME da linguagem Java. A distribui¸c˜ao voltada para J2SE apresenta as vers˜oes servidora e cliente de RME, por´em a distribui¸c˜ao desenvolvida para J2ME apresenta somente a vers˜ao cliente. N˜ao foi desenvolvida uma vers˜ao servidora para essa plataforma por raz˜oes pragm´aticas: dificilmente uma aplica¸c˜ao que ´e executada em um aparelho celular poderia ser utilizada como um servidor de invoca¸c˜oes remotas de m´etodos, pois tal fun¸c˜ao demanda recursos tais como capacidade de processamento e grande disponibilidade de mem´oria, recursos estes que um telefone m´ovel dificilmente possuiria. Al´em disso, as bibliotecas que comp˜oem a vers˜ao servidora de RME s˜ao cerca de duas vezes maiores que aquelas desenvolvidas para a vers˜ao cliente. O tamanho do pacote servidor ´e, assim, uma severa limita¸c˜ao, pois muitos dispositivos m´oveis simplesmente n˜ao possuem uma quantidade de mem´oria suficiente para armazenar todos os arquivos necess´arios.

Uma vez que funcionalidades que pertencem ao dom´ınio de servidores de chamadas remotas n˜ao s˜ao fornecidas pelo pacote Client_RME, n˜ao ´e poss´ıvel utilizar, sobre a plataforma J2ME, aplica¸c˜oes baseadas em RME capazes de receber call backs. Call back ´e o nome atribu´ıdo a um m´etodo que ´e executado sobre um cliente pelo servidor em resposta a uma invoca¸c˜ao remota originada pelo cliente. A t´ıtulo de exemplo, h´a, essencialmente, dois modos pelos quais um cliente pode ser notificado acerca da ocorrˆencia de um evento em um host remoto. No primeiro

AppStub TwoWayInvoker (from rme) RmeRequestSender (from rme) SynchronousConnector (from arcademis.concrete) TcpSocketChannel (from arcademis.concrete) RmeProtocol (from rme.rmep) RmeResponseReceiver (from rme) RmeRemoteCall (from rme)

Figura 4.11: Principais classes usadas por clientes para enviar e receber requisi¸c˜oes.

modo, o cliente continuamente verifica a ocorrˆencia do evento em quest˜ao por meio de conex˜oes a um servidor localizado naquele host. Na segunda forma, o cliente informa um servidor localizado no host remoto sobre o seu interesse no evento, e passa a aguardar um aviso de resposta. Tal aviso pode ser implementado como um call back. Com a vers˜ao cliente de RME, o mecanismo de call back n˜ao pode ser utilizado, pois a aplica¸c˜ao n˜ao tem como criar um servidor para esperar pela mensagem de retorno.

A implementa¸c˜ao do servi¸co de localiza¸c˜ao tamb´em apresenta diferen¸cas entre as vers˜oes cliente e servidora de RME. Conforme discutido na Se¸c˜ao 4.3.7, o acesso ao diret´orio de nomes se d´a via a classe RmeNaming, que fornece ao desenvolvedor de aplica¸c˜oes cinco m´etodos: lookup, bind, rebind, unbind e list. Estes cinco m´etodos, contudo, est˜ao presentes somente na vers˜ao servidora do middleware. A vers˜ao cliente do mesmo disponibiliza para as aplica¸c˜oes distribu´ıdas somente os m´etodos lookup e list. A ausˆencia dos demais m´etodos se justifica na medida em que eles s˜ao utilizados pela implementa¸c˜ao de objetos remotos para que estas possam se registrar em uma agˆencia de localiza¸c˜ao. Uma vez que essa capacidade de registro n˜ao ´e necess´aria para aplica¸c˜oes clientes, elas foram suprimidas.

A Figura 4.11 mostra como est˜ao relacionadas as principais classes respons´aveis pelo envio e recebimento de requisi¸c˜oes remotas no lado cliente de uma aplica¸c˜ao distribu´ıda. Nessa figura, a classe AppStub foi gerada automaticamente por RmeC. A Figura 4.12 mostra as principais classes envolvidas no processamento de chamadas remotas no lado do servidor. Algumas rela¸c˜oes foram omitidas a fim de diminuir a complexidade do diagrama apresentado.

Os principais pacotes que constituem Arcademis e RME s˜ao mostrados na Figura 4.13. O pa- cote arcademis.Concrete cont´em a implementa¸c˜ao de alguns componentes concretos que podem ser aproveitados em plataformas de middleware sem qualquer altera¸c˜ao e arcademis.server

RmeRemoteObject (from rme.server) RmeActivator (from rme.server) RmeDispatcher (from rme.server) AppSkeleton BlockingAcceptor (from arcademis.concrete) TcpConnectionServer

(from rme.server) RmeRequestReceiver

(from rme.server) RmeResponseSender (from rme.server) RmeProtocol (from rmep) TcpSocketChannel (from arcademis.concrete)

Figura 4.12: Principais classes usadas por servidores para enviar e receber requisi¸c˜oes.

cont´em componentes do arcabou¸co exclusivos para aplica¸c˜oes servidoras. Rme.server cont´em classes da parte servidora de RME. Rme.rmep implementa o protocolo de comunica¸c˜ao do mid- dleware. Rme.extras cont´em algumas classes que podem ser usadas no lugar de outras que normalmente s˜ao utilizadas, como a implementa¸c˜ao da semˆantica at-most-once, por exemplo. RME possui ainda outros dois subpacotes: rme.naming e rme.rmec. O primeiro cont´em a implementa¸c˜ao da agˆencia de localiza¸c˜ao e o segundo implementa o gerador de stubs e skeletons.