Capítulo 3 Aplicações Ocasionalmente Conectadas
3.3 Suporte da Smart Client Software Factory SCSF
3.3.3 O Bloco Aplicacional Disconnected Service Agent
Este bloco aplicacional tira partido dos dois blocos anteriormente descritos, (Connection Monitor Application Block e Endpoint Catalog Application Block) e fornece um conjunto de funcionalidades particularmente direccionadas para a execução de Web Services em aplicações ocasionalmente conectadas. Com este agente de serviço desconectado é possível à aplicação manter uma fila dos pedidos de execução de Web Services efectuados enquanto o dispositivo está desconectado, para posteriormente os executar se uma dada rede para o recurso ficar disponível.
Existem duas funcionalidades distintas neste bloco aplicacional:
• Um subsistema que permite invocar Web Services utilizando padrões semelhantes para quem está familiarizado com a utilização de Web Services proxies. Porém, o agente de serviço desconectado cria filas dos pedidos e mantém a rastreabilidade necessária para as respostas das chamadas assíncronas que a aplicação espera receber aquando da resposta do Web Service.
• Um dispacher que determina exactamente quando é que deve processar cada chamada a um Web Service levando em conta as condições de conectividade e custo das ligações. Quando a condição correcta ocorre, o dispacher efectua a chamada ao Web Service, utilizando os endereços e credenciais apropriados para o endpoint.
Aplicações Ocasionalmente Conectadas Capítulo 3
69
Estrutura do Disconnected Service Agent Application Block
Figura 3.4 – Estrutura do Disconnected Service Agent Application Block
Fonte: Smart Client Software Factory - April 2008. Microsoft Corporation, 2008
O Disconnected Service Agent Application Block é composto por um conjunto de classes principais, necessárias à utilização dos serviços fornecidos por este bloco aplicacional.
A classe RequestManager gere a fila de pedidos e utiliza os serviços disponibilizados pela classe RequestDispatcher para enviar os mesmos. A fila de pedidos pendentes e de pedidos falhados é armazenada do lado cliente, numa base de dados SQL Server Compact Edition, recorrendo à utilização da classe
DatabaseRequestQueue, ou através de uma implementação personalizada da interface IRequestQueue.
A classe Request constitui um encapsulamento do pedido ao Web Service, incluindo os argumentos necessários ao método do Web Service, o endpoint para entrega do pedido e propriedades que especificam como o dispatcher deve tratar e entregar o pedido. A classe EndpointCatalog (do Endpoint Catalog Application Block) expõe a informação dos endpoints existente no ficheiro de configuração da aplicação.
Capítulo 3 Aplicações Ocasionalmente Conectadas
70
Estrutura do Disconnected Service Agent Application Block (cont.)
A classe ConnectionMonitorAdapter fornece informação acerca da ligação utilizada pelo pedido (como por exemplo, o custo e detalhes das redes) e desencadeia eventos quando o estado da ligação muda. Como a própria palavra “Adapter” sugere, esta classe serve de ligação e conversão necessárias entre as classes RequestManager e
ConnectionMonitor (do Connection Monitor Application Block), sendo a última
responsável por monitorizar e expor as conexões e redes lógicas existentes.
A classe RequestManager controla o envio dos pedidos efectuados aos Web services, retirando as mensagens da fila e enviando-as quando a aplicação está conectada. Para manter a integridade dos pedidos e assegurar o correcto desempenho quando a aplicação não tem uma conexão activa, os pedidos são mantidos na base de dados até serem submetidos no servidor remoto ou até estes expirarem (devido à especificação de um tempo ou número máximo de tentativas). Desta forma a fila de pedidos sobrevive a eventuais perdas de conectividade.
Esta classe fornece funcionalidades que permitem o controlo do serviço de envio, expondo métodos para começar e parar o envio automático de pedidos, enviar todos os pedidos pendentes ou enviar individualmente cada um destes.
A classe RequestManager é um singleton e não possui um construtor pré-definido. O acesso à instância desta classe é efectuado através da sua propriedade Instance e chamando o método Initialize com uma série de parâmetros, nomeadamente: a fila para pedidos pendentes e falhados; a referência para uma classe que implemente a interface
IConnectionMonitor (como é o caso da classe ConnectionMonitorAdapter); uma
referência para uma classe que implemente a interface IRequestDispatcher (como é o caso da classe RequestDispatcher); uma instância da classe EndpointCatalog que contém a informação dos endpoints a utilizar pelos pedidos.
As filas que contêm os pedidos são instâncias de uma classe que implemente a interface IRequestQueue. O Disconnected Service Agent Application Block contém as classes DatabaseRequestQueue que armazena os pedidos numa base de dados local e
Aplicações Ocasionalmente Conectadas Capítulo 3
71
Estrutura do Disconnected Service Agent Application Block (cont.)
O diagrama da figura 3.5 representa o subsistema RequestManager indicando as propriedades, métodos e eventos expostos pelas diversas classes.
Figura 3.5 – Estrutura do subsistema RequestManager
Capítulo 3 Aplicações Ocasionalmente Conectadas
72
Estrutura do Disconnected Service Agent Application Block (cont.)
A classe Request e outras associadas fornecem as funcionalidades necessárias para criar pedidos a enviar a um Web Service remoto. A classe Request expõe propriedades que definem o comportamento, parâmetros (argumentos do Web Service), endpoints e outros detalhes de um pedido. A maioria dos pedidos a Web Services necessitam que os argumentos sejam enviados como parte integrante do pedido. Para o efeito esta classe expõe a propriedade CallParameters à qual se pode atribuir um array de objectos contendo os argumentos para o método do Web service. As classes CallParameters e
CallParametersSerializer possuem métodos que a DatabaseRequestQueue utiliza para
automaticamente serializar e deserializar o array de argumentos.
Os pedidos para um serviço remoto necessitam de detalhes do endpoint, como por exemplo a rede, endereço e credenciais. A propriedade Endpoint da classe Request expõe o nome de uma instância de Endpoint exposta pelo Endpoint Catalog application block.
O diagrama da figura 3.6 representa uma visão esquemática da classe Request e outras associadas, indicando as propriedades, métodos e eventos expostos.
Figura 3.6 – Estrutura da classe Request
Aplicações Ocasionalmente Conectadas Capítulo 3
73
Estrutura do Disconnected Service Agent Application Block (cont.)
Por fim, a classe ConnectionMonitorAdapter fornece um adaptador para o Connection Monitor Application Block e expõe informação acerca da ligação, permitindo testar se a aplicação está conectada, obter o nome da rede e o custo da conexão. Esta classe recebe uma instância de ConnectionMonitor no seu construtor.
A classe ConnectionMonitorAdapter expõe ainda eventos que permitem tratar situações relacionadas com a mudança de estado da conexão, como por exemplo, o
evento ConnectionStatusChange. Outro exemplo é o evento
ActiveNetworkChangedEvent que ocorre quando o dispositivo muda a sua ligação para
outra rede.
No diagrama da figura 3.7 representa-se uma visão esquemática da classe
ConnectionMonitorAdapter, indicando as propriedades, métodos e eventos expostos.
Figura 3.7 – Estrutura da classe ConnectionMonitorAdapter
Capítulo 3 Aplicações Ocasionalmente Conectadas
75