Partie I : Littérature contemporaine et écritures de soi
4. Retour aux Sources (familiales et littéraires)
Quando um utilizador inicia a composição, pode já ter uma noção exacta das tarefas a executar recorrendo à composição ou pode simplesmente iniciar a composição escolhendo os serviços que lhe vão sendo sugeridos. Em ambas as situações a composição de serviços é um processo contínuo onde o utilizador pode adicionar ou remover novos serviços de uma forma dinâmica e interactiva, pretendendo esta arquitectura simplificar essa tarefa. Todas as funcionalidades relativas à composição e gestão de serviços são fornecidas pelo motor de
composição, que dependendo da tarefa a executar irá comunicar com os outros componentes
da arquitectura.
O motor de composição é composto por quatro componentes: núcleo do motor de
composição, gestor de serviços, execução de serviços e descoberta e selecção de serviços. Na
Figura 5.7 são ilustrados esses quatro componentes e as ligações a outros componentes do sistema com os quais interagem directamente.
Figura 5.7 – Arquitectura do motor de composição.
O componente núcleo do motor de composição oferece a funcionalidade de composição de serviços ao cliente através de um Web Service. A composição de um novo serviço será conseguida através de uma visualização prévia dos serviços disponíveis e da posterior selecção de um serviço para fazer parte dessa composição. Este componente cria um workflow de invocação de serviços apresentando os serviços disponíveis em cada passo da composição. No final, esse workflow será reconhecido como um serviço próprio que poderá ser executado, armazenado ou usado noutra composição.
A apresentação de uma lista de serviços ao utilizador ocorrerá sempre que este seleccionar um novo serviço. Nessa lista irão constar apenas os serviços sintacticamente compatíveis com o serviço seleccionado e ordenados com base no contexto do utilizador. Essa lista é fornecida pelo componente descoberta e selecção de serviços e sofre duas operações: a primeira é uma filtragem sintáctica, pois não faz sentido apresentar serviços que não sejam compatíveis com o estado actual do fluxo de composição; a segunda é a ordenação dos serviços, de modo a que apareçam em primeiro lugar os “melhores” serviços com base na análise do contexto do utilizador. Podem existir várias formas de utilizar a informação contextual para lidar com os serviços: fazer apenas a selecção de serviços adequados ao contexto actual do utilizador, proceder à eliminação dos serviços não contextuais ou realizar uma ordenação dos serviços
atribuindo-lhes uma pontuação proporcional à sua adequação ao contexto. A solução escolhida foi a última, a de oferecer ao utilizador uma lista de serviços ordenados. Esta escolha permite ao utilizador aceder a serviços que poderiam ser considerados como dispensáveis no actual contexto em que o utilizador se encontra e como tal ficariam fora do seu alcance. Esta opção tem a desvantagem de em determinadas situações produzir uma lista de serviços demasiado extensa, com muitos serviços que não são do interesse do utilizador. O funcionamento desta solução será apresentado e descrito mais à frente. Os serviços disponíveis no repositório são carregados em memória e de cada vez que é gravado um serviço no repositório este também será adicionado à lista de serviços que se encontra em memória.
A execução de um serviço poderá ser realizada de duas formas: em qualquer momento durante a composição de um serviço, ou através da selecção de um serviço que se encontre no
repositório de serviços e ordenando a sua execução. Quando um serviço é executado poderá
ter de retornar diversos tipos de dados que serão entregues ao cliente através do componente
adaptador de conteúdos. O componente de execução de serviço contém um motor capaz de
invocar de igual forma processos atómicos ou processos compostos que contêm construtores de controlo. Quando este componente executa uma composição, ele segue um workflow para invocar cada serviço de forma individual e troca os dados entre eles de acordo como o fluxo construído pelo utilizador.
O gestor de serviços distingue os dois tipos de utilizadores: utilizador e administrador. Os casos de utilização que são comuns a estes dois tipos de utilizadores serão executados do mesmo modo, diferindo obviamente no alcance das permissões, pois o administrador terá permissões totais de gestão. Como o próprio nome indica, este componente permite gerir os serviços do sistema e inclui as seguintes funcionalidades: armazenamento, pesquisa, partilha e remoção de serviços. O armazenamento poderá ser feito por qualquer utilizador e permite guardar a descrição do serviço num repositório para utilização futura. Quando se fala em armazenamento de um serviço, convém realçar que apenas se trata de guardar a sua descrição ou interface, porque a sua funcionalidade continua a ser oferecida por um fornecedor de serviços interno ou externo à organização. A pesquisa de serviço permite procurar um serviço utilizando as informações que este contém na sua descrição. A partilha de um serviço consiste em armazenar esse serviço num repositório com permissões de partilha para todos os utilizadores do sistema, por forma a criar uma rede de serviços evolutivos. Esta partilha funcionará de modo semelhante ao registo UDDI, que guarda informações sobre os
descritores dos serviços e sobre os fornecedores de serviços. A remoção de serviços consiste em remover a descrição do serviço do repositório de serviços. O utilizador apenas poderá remover os seus serviços enquanto que o administrador poderá remover qualquer serviço.
A Figura 5.8 apresenta o diagrama de sequência do caso de utilização “composição de serviço” por parte de um utilizador.
Figura 5.8 – Diagrama de sequência de uma composição de serviços.
O utilizador, através de uma interface cliente, inicia a execução seleccionando um serviço da lista que lhe é disponibilizada. Uma vez seleccionado o primeiro serviço para fazer parte da composição, o componente descoberta e selecção de serviços procura serviços usando os dados coleccionados pelo motor de contexto e retorna novas possibilidades, baseadas no actual contexto e nas preferências do utilizador, segundo o mecanismo que é ilustrado na
Cliente Motor de Composição
pedido para composição de serviço
Motor de Contexto
Motor de Adaptação
consulta_contexto_do_utilizador(utilizador)
dados contextuais do utilizador()
lista_de_serviços()
pedir_nova_lista_de_serviços(utilizador, serviço_anterior)
consulta_contexto_do_utilizador(utilizador)
dados contextuais do utilizador()
lista_de_serviços()
execução da composição
ciclo de composição
selecção de um novo serviço
execução da composição
adaptacao_resultados()
resultados_adaptados()
descoberta_e_selecção(serviços, utilizador, dados_contextuais) descoberta_e_selecção(serviços, utilizador, preferências, dados_contextuais)
execução_de_serviços(serviços)
através da identificação do terminal são analisados se os resultados necessitam de ser adaptados. Caso
necessitem de ser adaptados, é invocada uma função de adaptação
Utilizador
criar proxy do serviço de composição iniciar composição(utilizador)
Figura 5.9. A descoberta e a selecção apenas são possíveis devido à descrição de serviços utilizando ontologias, que permitem criar relações com outras ontologias que podem descrever detalhes sobre o tipo de serviço e as suas características. A descoberta é executada utilizando a descrição do perfil do serviço, que caracteriza o que os serviços podem fazer e especifica o tipo de entradas/saídas, pré-condições e efeitos. Considerando-se que a composição será criada na forma de pilha, isto é, o primeiro serviço seleccionado será aquele que irá definir a saída do serviço composto, é feita uma selecção dos serviços cuja a saída seja compatível com as entradas do serviço anteriormente seleccionado. Por fim, os serviços são ordenados utilizando os parâmetros de avaliação definidos no perfil de serviços e uma política de avaliação de serviços particular do utilizador.
Figura 5.9 – Mecanismo de selecção de serviços, baseado em (Sousa, Carrapatoso et al., 2009).
Este ciclo de entrega de serviços ao utilizador e sua selecção é mantido até este decidir terminar a sua composição ou não haver mais serviços disponíveis que possam ser combinados. Quando o utilizador finalizar a sua composição, a entidade núcleo do motor de
composição terá criado um serviço composto que contém um workflow, que terá como
parâmetros de entrada os mesmos do(s) últimos(s) serviço(s) e como saída os parâmetros de saída dos primeiro(s) serviço(s) da composição. Este novo serviço composto pode depois ser guardado, executado, partilhado ou utilizado no processo de composição de um novo serviço. Se, por exemplo, o utilizador optar pelo armazenamento da composição no repositório de
serviços, essa tarefa é executada pelo núcleo do motor de composição (que contém a
descrição do novo serviço) que invoca funções do gestor de serviços. Filtragem
Cálculo e ordenação