Utilização de Web Services em Ambientes de Grid ...
-
Upload
khangminh22 -
Category
Documents
-
view
0 -
download
0
Transcript of Utilização de Web Services em Ambientes de Grid ...
UNIVERSIDADE FEDERAL DE SANTA CATARINA
Utilização de Web Services em Ambientes de Grid Computacional
Vitor Hugo Vargas Horewicz
UNIVERSIDADE FEDERAL DE SANTA CATARINADEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICACURSO DE CIÊNCIAS DA COMPUTAÇÃO
Título: Utilização de Web Services em ambientes de Grid Computacional
Autor: Vitor Hugo Vargas Horewicz
Orientador: Mario A. R. Dantas
Banca Examinadora:
Carlos B. Westphall
José Eduardo De Lucca
Palavras-Chave:
grid computing, web services, OGSI, Globus Toolkit, computação distribuída
Florianópolis, 5 de Fevereiro de 2004
SUMÁRIO1 Introdução..........................................................................................................................................92 Computação distribuída...................................................................................................................11
2.1 Sistemas paralelos ou multiprocessados..................................................................................112.2 Sistemas distribuídos ou multicomputadores..........................................................................122.3 Meta Sistemas e metacomputação...........................................................................................122.4 Clusters....................................................................................................................................132.5 Computação peer to peer.........................................................................................................142.6 Processamento paralelo oportunístico na Internet...................................................................15
3 Grids Computacionais e Web Services...........................................................................................163.1 O problema do grid e as organizações virtuais........................................................................173.2 O surgimento das Organizações Virtuais.................................................................................193.3 Tecnologia e arquitetura do grid..............................................................................................203.4 Descrição da arquitetura do grid..............................................................................................21
3.4.1 Fabric: interfaces para controle local...............................................................................223.4.2 Conectividade: comunicando-se de forma segura e efetiva.............................................223.4.3 Recursos: compartilhando recursos individuais...............................................................233.4.4 Coletiva: coordenando recursos múltiplos.......................................................................233.4.5 Aplicações........................................................................................................................23
3.5 Segurança em ambientes de grid computacional.....................................................................243.6 Comentários sobre JAVA, JINI, CORBA e DCOM...............................................................243.7 Questões referentes aos ambientes de grid computacional......................................................243.8 Web Services...........................................................................................................................25
4 Projeto e ambiente de desenvolvimento..........................................................................................304.1 Especificar uma interface de serviços......................................................................................304.2 Gerar código de suporte ao Grid Service.................................................................................314.3 Implementar o serviço.............................................................................................................324.4 Distribuir o serviço..................................................................................................................324.5 Um cliente para testar o Grid Service......................................................................................34
5 Decisões de projeto..........................................................................................................................355.1 Linguagem JAVA....................................................................................................................355.2 Sistema operacional GNU/Linux.............................................................................................365.3 Middleware Globus Toolkit.....................................................................................................36
5.3.1 O que é o Globus Toolkit.................................................................................................375.3.2 Componentes do núcleo do Globus Toolkit.....................................................................38
5.4 Ambiente de desenvolvimento.................................................................................................385.4.1 Hardware..........................................................................................................................385.4.2 Software...........................................................................................................................39
6 Trabalhos futuros e conclusão.........................................................................................................406.2 Trabalhos futuros.....................................................................................................................406.1 Conclusão.................................................................................................................................40
ANEXOS............................................................................................................................................43Math.java.......................................................................................................................................43MathService.wsdl..........................................................................................................................43MathPortType.java........................................................................................................................47MathServiceGridLocator.java........................................................................................................47MathService.java...........................................................................................................................48MathServiceLocator.java...............................................................................................................49MathServiceSoapBindingStub.java...............................................................................................52MathImpl.java................................................................................................................................56Math.wsdd......................................................................................................................................57Build.xml.......................................................................................................................................58
MathClient.java..............................................................................................................................61MathClient2.java............................................................................................................................61Artigo sobre o projeto....................................................................................................................62
Índice de tabelasTabela 1 - Parâmetros WSDL.............................................................................................................33Tabela 2 - Configuração de hardware utilizada..................................................................................39Tabela 3 - Configuração de software utilizada...................................................................................39
Índice de FigurasFigura 1 - Camadas da arquitetura de protocolo do Globus...............................................................22Figura 2 - Exemplo de invocação de um web service........................................................................26Figura 3 - Arquitetura de um web service..........................................................................................27Figura 4 - Componentes de um Grid Service.....................................................................................29Figura 5 - Modelos de desenvolvimento de Grid Services.................................................................31
RESUMOO presente trabalho é uma introdução aos ambientes de Grid Computacional, apresentando-os
como uma plataforma para execução de aplicações paralelas.
No primeira parte é feita uma breve análise histórica. Quais fatores levaram ao desenvolvimento
das tecnologias abordadas no trabalho e quem pode vir a se beneficiar destas inovações.
Na segunda parte são apresentados conceitos teóricos sobre computação distribuída. Diversos
tipos de computação distribuída são analisados para enfatizar as diferenças entre estas soluções e os
grids computacionais.
Na terceira parte finalmente é definido o que é um grid computacional. Ilustra-se em que
situações pode ser empregado, especificando “o problema do grid”. A tecnologia envolvida e a
arquitetura desses ambientes também é analisada. Na conclusão desta parte os aspectos de
segurança, comparações com outras tecnologias de computação distribuída e os equívocos
resultantes da ignorância dos conceitos são analisados.
A seguir, na quarta parte, é mostrado o que são os Web Services e o seu papel neste novo
paradigma de computação distribuída.
A quinta parte apresenta um roteiro para o desenvolvimento de aplicações para ambientes de
grid computacional, os Grid Services, com referências aos módulos da aplicação exemplo
desenvolvida para o trabalho.
Na sétima parte são listadas as decisões de projeto, o que motivou na escolha de determinada
plataforma de software para a confecção deste trabalho.
Na oitava parte as especificações técnicas de equipamentos e software são listadas.
Conclui-se o trabalho com os rumos que podem ser seguidos para projetos futuros e é feita uma
avaliação da situação atual da pesquisa e emprego da tecnolgia em ciência, engenharia e indústria.
8
1 Introdução
A partir da década de 1980 iniciou-se um processo desencadeado pela popularização dos
chamados computadores pessoais. A computação tornou-se onipresente, passando a compor o
ambiente de escritórios e residências. Ao mesmo tempo em laboratórios e universidades uma outra
revolução tomava lugar, a pilha de protocolos TCP/IP cada vez mais era reconhecida como um
padrão de interconexão.
Naturalmente aquilo que era utilizado apenas nos ambientes de pesquisa tornou-se tecnologia de
mercado, culminando na década seguinte com a “Internet”. Aliado a iniciativas de empreendedores
visionários e a massivos investimentos por parte das empresas de computação e áreas afins, criou-se
uma euforia em torno dessa infra-estrutura de telecomunicações. O parque recursos computacionais
foi vertiginosamente ampliado na esperança de se obter lucros nessa nova empreitada comercial, um
novo ramo de negócios que convencionou-se chamar indústria de tecnologia da informação.
Porém por diversos motivos o ritmo de crescimento da economia mundial não atendeu as
expectativas. Mesmo com o aumento da complexidade da economia, de escala e do volume de
dados, percebeu-se que o investimento em equipamentos foi excessivo e parte destes recursos estava
agora ociosa.
Surgiu a necessidade de se justificar todo o capital investido.
Porém, há uma modalidade de problemas e aplicações que, seja pela sua complexidade ou pelo
grande volume de dados envolvidos, não podem ser solucionados pelos tradicionais sistemas
computacionais providos de um único processador.
As soluções tradicionais para essa classe de problemas passam pelo emprego de
supercomputadores, mainframes ou clusters. Foi nesse momento que os olhos da indústria de
tecnologia da informação se voltaram novamente para os laboratórios e universidades.
A comunidade de computação distribuída e de computação de alto desempenho estava
pesquisando um novo conceito que permitiria o compartilhamento de recursos e o trabalho
colaborativo sem que novos gastos fossem feitos.
A pesquisa de ambientes de grid computacional viria a permitir a concretização desses
objetivos. A intenção da pesquisa desses ambientes seria permitir que computadores pessoais,
estações de trabalho, mainframes e supercomputadores, mas também instrumentos, como sensores
meteorológicos ou microscópios eletrônicos pudessem ser conectados e seu uso compartilhado.
Voltando um pouco no tempo, para compreender melhor a situação atual. O surgimento dos
termos Grid e grid computacional e as idéias por trás dos conceitos que esses termos evocam não
são novas. Compartilhamento de recursos computacionais é a idéia central por trás desses termos e
9
conceitos e remonta as décadas de 1960 e 1970, nessa época a computação era dominada por
computadores mainframes e compartilhados por organizações inteiras.
Mas foi por volta de 1965, quando os desenvolvedores do sistema operacional Multics
apresentaram uma visão de computação como uma utilidade[1]. Os recursos poderiam ser
acessados da mesma forma que a eletricidade, a água ou o gás; algo que o cliente se conecta e paga
de acordo com a quantidade utilizada. É a partir dessa analogia que hoje o termo Grid é utilizado
para descrever essa determinada classe de sistema distribuído que será o objeto de estudo neste
trabalho.
De acordo com Alvarenga[2], a palavra grid, como verbete da língua inglesa é utilizada em
referência a rede de energia elétrica (geração, transmissão e distribuição). Esta rede é a infra-
estrutura que possibilita o uso da energia elétrica de forma consistente, generalizada, barata e
confiável.
A pesquisa de ambientes de grid computacional atrai muita atenção, pois apesar de incerto, o
seu futuro é muito promissor.
A intenção deste trabalho é esclarecer o conceito de grid computacional em meio a euforia que
existe com relação ao tema. Alguns autores, céticos quanto a aplicação dos grids não o definem
apropriadamente. Será mostrado que existe uma classe de problemas muito específica que podem
ser solucionados com o emprego dessa infraestrutura.
Inicialmente será feita uma distinção entre outras formas de computação distribuída como:
metacomputação, computação em cluster, peer to peer e computação de internet.
Será mostrado como a utilização de “web services” é adequada para o desenvolvimento de
aplicações e serviços a serem executados nesses ambientes ou plataformas de execução.
Um objetivos do trabalho é apresentar um modelo de desenvolvimento de aplicações/serviços
para os ambientes de grid computacional. Serão apresentados exemplos desenvolvidos,
justificativas para a escolha de determinadas tecnologias e rumos futuros desse ramo de pesquisa da
ciência da computação.
10
2 Computação distribuída
Atualmente quando tem-se um problema cuja solução não é facilmente atingida devido a
magnitude dos cálculos a serem executados uma das alternativas é interligar recursos
computacionais, seja em uma empresa ou instituição acadêmica. Esta alternativa é chamada
computação distribuída, este termo a grosso modo, se refere a um sistema onde muitos
processadores trabalham em um problema juntos.
Alguns dos benefícios resultantes do uso de sistemas distribuídos ou paralelos são:
• compartilhamento de recursos;
• aumento de velocidade de processamento;
• confiabilidade;
• comunicação;
Neste contexto as grids computacionais são apenas mais uma forma de computação distribuída.
Existem outros exemplos de computação distribuída, alguns destes são descritos abaixo.
2.1 Sistemas paralelos ou multiprocessados
Estes sistemas possuem mais de um processador se comunicando, compartilhando barramento,
clock e às vezes memória e dispositivos periféricos. Esta categoria de sistemas é conhecida como
sistemas fortemente acoplados (tightly coupled systems)[3].
Existem diversas razões para a utilização destes sistemas. Uma das vantagens é o aumento de
vazão (throughput). Pelo aumento do número de processadores espera-se obter um maior volume de
trabalho em um período de tempo menor. O aumento de velocidade com n processadores, no
entanto, é inferior a n. Quando múltiplos processadores cooperam em uma tarefa, existe um
overhead inerente na manutenção das partes trabalhando em conjunto. Esse overhead e a contenção
no uso de recursos compartilhados reduz a expectativa de ganho pelo uso dos processadores
adicionais.
Multiprocessadores podem significar economia quando comparados a múltiplos sistemas
individuais, pois eles podem compartilhar periféricos, fontes de energia, etc.
Outra razão para o emprego de sistemas multiprocessados é o aumento de confiabilidade. Se as
funções puderem ser apropriadamente distribuídas entre os processadores, então a falha de um
11
processador não irá causar a parada do sistema, apenas o tornará lento. Se houverem 10
processadores e um deles falhar, então os nove remanescentes podem dividir uma parcela do
trabalho executado pelo processador que falhou. Dessa forma o sistema irá ter uma execução apenas
10% mais lenta, ao invés de falhar por completo. A capacidade de proporcionar serviço
proporcional ao nível de hardware remanescente é chamada de “degradação graciosa”(graceful
degradation). Sistemas que são desenvolvidos para operar com degradação graciosa são chamado de
tolerantes à falhas (fault tolerant).
2.2 Sistemas distribuídos ou multicomputadores
Em contraste com os sistemas fortemente acoplados, sistemas distribuídos não compartilham
memória ou o clock. Cada processador possui sua memória local, se comunicam através de linhas
de comunicação como barramentos de alta velocidade ou linhas telefônicas. Esta categoria de
sistemas é chamada de sistemas fracamente acoplados (loosely coupled systems) ou sistemas
distribuídos (distributed systems).
Os processadores em um sistema distribuído podem variar em tamanho e função. Podem incluir
pequenos microprocessadores, estações de trabalho, minicomputadores e grandes computadores de
propósito geral. Estes processadores são referenciados por diversos nomes como sites, nodos,
computadores, dependendo do contexto em que são mencionados.
2.3 Meta Sistemas e metacomputação
Metacomputação é o antecessor imediato dos ambientes de grid computacional. O termo
descreve projetos focalizados na interconexão de supercomputadores a fim de utilizar seu poder de
processamento combinado.
É neste contexto que se encaixam os meta sistemas, ou seja, sistemas computacionais
distribuídos compostos por um grupo de computadores autônomos, interligados por uma rede
hierárquica[4].
Segundo Silberschatz, uma rede hierárquica é composta por “sites” organizados sob a forma de
uma árvore[3]. Este tipo de organização é utilizada em redes corporativas. Por exemplo, empresas
terceirizadas locais são interligadas com escritórios regionais. Escritórios regionais são interligados
com as filiais dos estados. As filiais dos estados são interligadas com a matriz em Brasília.
Cada “site” possui um único nó pai e alguns (ou possivelmente nenhum) filho. Neste ambiente,
nós pais e filhos se comunicam diretamente. Outras formas de comunicação passa pelos níveis
superiores e depois desce pela hierarquia.
12
Infelizmente, escrever software para estes sistemas é difícil, primeiramente o programador deve
lidar com toda a complexidade inerente a qualquer sistema de programação paralela: gerenciamento
de comunicação e sincronização, escalonamento e um número potencial de tarefas independentes
além de decomposição e distribuição de dados. Em um sistema heterogêneo estas tarefas se tornam
ainda mais difíceis, havendo ainda o problema adicional da conversão de dados.
Mais detalhadamente, um meta sistema é um sistema distribuído composto por hosts
heterogêneos (tanto processadores paralelos quanto arquiteturas convencionais), possivelmente
controlados por entidade computacionais distintas, e interligados por uma conexão de rede irregular,
com possíveis disparidades de latência e largura de banda. Algumas sub-redes podem ser regulares,
facilmente analisáveis, enquanto outras podem ser irregulares.
Algumas sub-redes podem ser máquinas paralelas ou clusters dedicadas exclusivamente ao uso
do meta sistema, outras podem transportar tráfego aleatório, por exemplo, tráfego internet.
A visão do usuário de um meta sistema ideal é aquela de uma poderosa máquina virtual,
monolítica que proporciona serviços de armazenamento e processamento de dados. O usuário não
precisa se preocupar com os detalhes da máquina, tipo do processador, forma de representação dos
dados e localização física dos processadores e dados ou com a existência de usuários concorrentes.
O usuário não vê fronteiras no sistema, apenas objetos, tanto objetos de aplicação, ou seja
executáveis, quanto objetos de dados, como arquivos. A localização e representação destes objetos é
escondida.
2.4 Clusters
Segundo Alvarenga, um cluster é um tipo de sistema distribuído cujos elementos de
processamento são computadores “inteiros” (computadores pessoais, workstations) e que é visto e
usado como se fosse um recurso computacional único e indivisível[2].
Um cluster é diferente de um grid computacional, Buyya esclarece: “se acontece o
compartilhamento de recursos gerenciado por um único sistema global, sincronizado e centralizado,
então é um cluster. Em um cluster todos os nós trabalham cooperativamente, em um objetivo
comum e o objetivo é a alocação de recursos executada por um gerente centralizado e global. Em
Grid, cada nó possui seu próprio gerente de recursos e política de alocação[5].” Outras
características que distinguem um cluster de um ambiente de grid computacional são os aspectos de
homogeneidade e baixa dispersão dos elementos de processamento que compõem este arranjo.
Um cluster típico apresenta as seguintes características[2]:
13
• pertence a um domínio administrativo único e por isso é utilizado para resolver
problemas de interesse de uma determinada empresa ou grupo de pesquisa;
• externamente é visto como um recurso computacional único. Seus elementos de
processamento não possuem identidade própria, sendo apenas engrenagens de uma
entidade maior, o cluster;
• a latência nas comunicações é baixa (da ordem de centenas de µs, ou menor);
• a taxa de transmissão disponível é elevada (a partir de dezenas de Mbps até,
atualmente, dezenas de Gbps);
• pode se beneficiar de protocolos de comunicação mais eficientes entre seus elementos
de processamento, pois a rede de interconexão, pertence a um mesmo domínio
administrativo;
• a segurança na comunicação entre elementos de processamento diminui de importância,
chegando mesmo a ser desnecessária, caso a rede de interconexão (intracluster) seja
desacoplada da rede de acesso ao cluster;
• pode-se ter homogeneidade de hardware e software nos elementos de processamento, o
que facilita a programação;
• sua escalabilidade é limitada.
2.5 Computação peer to peer
Computação peer to peer permite que computadores troquem arquivos ou outros dados (por
exemplo, uma conversa através de um cliente de mensagens instantâneas) sem que esses dados
precisem trafegar por um servidor.
Segundo Shirky, “ peer to peer é uma classe de aplicações que se beneficia dos recursos
disponíveis nas extremidades da Internet, sejam estes recursos armazenamento, ciclos de
processamento, conteúdo ou mesmo presença humana. Acessar estes recursos descentralizados
implica operação em um ambiente de interconexão instável e resolução de endereços imprevisível,
os agentes peer to peer (...) devem ter significativa ou total autonomia de servidores”[6].
14
Se analisada de forma ortodoxa a computação peer to peer não irá atender aos requisitos que
definem um sistema distribuído, mas seus princípios de operação são utilizados em sistemas que
atendem a esses requisitos.
2.6 Processamento paralelo oportunístico na Internet
O processamento paralelo na Internet é um tipo de arranjo para computação distribuída chamado
“ cycle scavenging” ou, em uma tradução livre vasculhamento de ciclos de processamento[1]. A
aplicação conta com a utilização de recursos computacionais ociosos para o completamento de uma
tarefa. Naturalmente o processamento paralelo oportunístico na Internet não é uma estratégia viável
para todas as tarefas computacionais.
Segundo Alvarenga, os problemas que melhor se adaptam a esta solução devem possuir as
seguintes características[2]:
• ter granularidade grande, permitindo explorar o paralelismo no nível de processo ou
tarefa;
• ser fracamente acoplado, devendo haver predomínio da computação sobre a
comunicação;
• fazer uso intensivo de CPU;
• necessitar pouca largura de banda na comunicação;
• ser tolerante a alta latência;
• não ter que cumprir prazos rigorosos de execução.
15
3 Grids Computacionais e Web Services
Grid computing se distingue da computação distribuída tradicional pelo seu foco no
compartilhamento de recursos em larga escala, aplicações inovadoras e, em alguns casos, orientação
a computação de alto desempenho.
Segundo Cirne, um grid computacional é um sistema que fornece poder computacional sob
demanda e de forma transparente, conceitua o grid como uma “plataforma para execução de
aplicações paralelas.[7]” O autor enumera cinco pontos que diferenciam o grid de outros sistemas
de computação distribuída:
• heterogeneidade nos componentes do grid;
• alta dispersão geográfica, grids podem ter escala mundial;
• compartilhamento, no sentido de que o grid não pode ser dedicado a uma [única]
aplicação;
• múltiplos domínios administrativos, grids podem congregar recursos de várias
instituições;
• controle distribuído, tipicamente não há uma única entidade que tenha controle sobre
todo o grid.
Um levantamento de requisitos mais genérico foi feito por Foster. Ele afirma que um grid é um
sistema que:
• Coordena recursos que não estão sujeitos a um controle centralizado: um grid integra e
coordena recursos e usuários que habitam domínios distintos (por exemplo um
computador pessoal e um computador central, unidades administrativas distintas de uma
mesma empresa ou empresas diferentes) e lida com questões como segurança, políticas
e contas de usuários. Do contrário não se trata de um grid, mas apenas um sistema de
gerenciamento local;
• Utiliza protocolos e interfaces genéricos, abertos e padronizados: se não for desta forma
trata-se de um sistema específico com muitas restrições que vão de encontro com um
aspecto básico de um grid, a heterogeneidade;
16
• Disponibiliza diversas modalidades de qualidade de serviço (QoS): um grid deve
permitir que os recursos que o compõem sejam utilizados de maneira coordenada
atendendo a diversos parâmetros de qualidade de serviço, como tempo de resposta,
vazão, disponibilidade e segurança. Deve permitir a co-alocação de recursos (recursos
alocados que convocam outros recursos).
3.1 O problema do grid e as organizações virtuais
Os pesquisadores dos ambientes de grid computacional acreditam que a utilização efetiva dessa
forma de computação distribuída se dará através de “Organizações Virtuais.”
Atualmente não existe “O Grid”, pelo menos não da mesma forma que todos os roteadores,
servidores e enlaces de rede formam aquilo que chamamos de “A Internet”; ou ainda da mesma
forma que todos os servidores HTTP e os arquivos neles hospedados formam “A Web”[8]. O que
existe é um certo número de grupos que mantém infraestruturas de grids para seus propósitos, estes
grupos chamados “Organizações Virtuais”. Exemplos dessas organizações virtuais são a EU
DataGrid, NASA Information Power Grid, NSF Alliance, NPACI Technology Grids e a Asia-
Pacific Grid. Todas elas utilizam a mesma tecnologia, portanto poderiam teoricamente funcionar
como "o Grid" caso viessem a operar em conjunto.
A tecnologia de computação distribuída existente hoje, não atende a determinados requisitos que
as grids computacionais se propõem a solucionar. Por exemplo, a Internet proporciona comunicação
e troca de informação entre computadores, mas não permite que seja feita a utilizacão coordenada
de recursos computacionais em localidades remotas.
Portanto o surgimento das Organizações Virtuais e de necessidades que seriam melhor atendidas
com um conjunto de tecnologias inexistentes levou ao aprimoramento de idéias latentes nas
comunidades de processamento de alto desempenho e de computação distribuída culminando com o
surgimento dos ambientes de grid computacional. O problema real e específico subjacente a este
conceito é o compartilhamento coordenado e a solução de problemas em Organizações Virtuais
dinâmicas e multi-institucionais[9].
Neste contexto, compartilhamento, não se trata unicamente de arquivos, mas de acesso direto a
computadores, programas, dados e outros recursos a medida que forem necessários por um numero
crescente de novas estratégias adotadas pela indústria, ciência e engenharia.
Este compartilhamento e, necessariamente, altamente controlado, afirma o autor. Com
provedores e consumidores de recursos definindo clara e cuidadosamente o que e compartilhado,
quem tem permissão para compartilhar e as condições sob as quais o compartilhamento ocorre.
17
Reiterando, um conjunto de indivíduos e/ou instituições definido por essas regras forma uma
Organização Virtual.
Um cenário típico para o emprego das grids computacionais seria uma organização que conta
com serviços terceirizados por outras entidades, e, todas juntas, estão engajadas em um grande
projeto. Precisam compartilhar dados e recursos para atingir suas metas no menor prazo e com
maior economia possíveis.
Exemplos seriam um fabricante de veículos que reune seus fornecedores de pecas, de serviços e
consultores para elaborar o planejamento para a inauguração de uma nova fábrica montadora; outra
situação seriam membros de um consorcio industrial reunidos para a construção de uma nova
aeronave.
De forma geral listar tipos de aplicações que se beneficiariam do uso de grids computacionais
[10]:
• computação sob demanda ou computação just-in-time: computação sob demanda
disponibiliza recursos que geralmente são necessários por curtos períodos de tempo e
em freqüências irregulares. Quando este tipo de recurso é requisitado, normalmente é
necessário imediatamente. Devido ao fato desses recursos serem necessários de forma
esparsa, pode não haver uma boa justificativa para possuir estes recursos. Em um
ambiente de grid, muitos usuários podem compartilhar estes recursos com baixo custo;
• computação orientada a dados (data-intensive computing): o grid deve solucionar o
escalonamento e configuração dos fluxos de grandes volumes de dados.
• computação colaborativa (collaborative computing): permite a construção de
laboratórios sem paredes, permite ampliar as interações entre humanos e recursos
computacionais que possam estar geograficamente dispersos.
• computação de alta taxa de rendimento (high-throughput computing): envolve a
execução do maior número possível de tarefas em um determinado período de tempo.
• supercomputação distribuída: um dos objetivos das grids computacionais é resolver
problemas, que não poderiam ser solucionados em um único sistema, pela agregação de
recursos localizados em diferentes locais. A supercomputação distribuída pode ser um
componente de outras aplicações de grid como computação sob demanda e computação
colaborativa.
18
Assim sendo, a questão do Grid pode ser definida como o compartilhamento flexível, seguro e
coordenado de recursos entre grupos dinâmicos de indivíduos, instituições e dispositivos, chamados
“ Organizações Virtuais”(Virtual Organizations).
3.2 O surgimento das Organizações Virtuais
Organizações Virtuais possuem o poder de mudar dramaticamente a forma como usamos
computadores para resolver problemas, da mesma forma que a WEB mudou a forma como
trocamos informações[9].
A necessidade de se engajar em processos colaborativos e fundamental para diversas disciplinas
e atividades, não estando limitada as ciências, engenharia ou aos negócios. E graças a esta ampla
aplicabilidade que o conceito de Grids Computacionais é importante.
Esse arranjo de indivíduos e instituições possui certos condicionantes ou aspectos relevantes
para seu sucesso:
• “distrustful participants”: participantes desconfiados tendo que compartilhar software,
computadores, dados, sensores, etc;
• compartilhamento de recursos condicional: cada proprietário de recursos os torna disponíveis
sujeitos a restrições de quando, onde e o que pode ser feito. Por exemplo, um participante de uma
organização virtual pode permitir aos seus parceiros a invocação de uma simulação apenas para
problemas considerados simples;
• definição de restrições de acesso: requer o uso de mecanismos para o estabelecimento de
políticas de autenticação (quem acessa) e autorização (o que acessa);
• natureza de relações de compartilhamento: são definidas por quais recursos podem ser
acessados, a qualidade desses recursos e as políticas que governam o acesso. Devido a falta de
conhecimento prévio sobre como um recurso será utilizado, algumas informações como métricas
de performance, estimativas e limitações (qualidade de serviço), podem fazer parte das condições
para compartilhamento.
Foster afirma que os ambientes de Organizações Virtuais devem possuir as seguintes
características[9]:
• Log on único: o usuário deve autenticar-se perante o sistema uma única vez e desfrutar
de acesso aos recursos da camada Fabric (maiores detalhes na seção 3.4 Descrição da
arquitetura do grid) sem intervenção posterior;
19
• Delegação: as permissões de um usuário devem ser herdadas pelos pelos processos que
ele executa e estes processos podem delegar um subconjunto de suas permissões para
outros processos.
• Integração com diversas soluções de segurança locais;
• Relações de confiança orientadas a usuário.
3.3 Tecnologia e arquitetura do grid
A natureza das tecnologias envolvidas com grid passa por ferramentas que dêem suporte ao
gerenciamento de credenciais e políticas quando o poder computacional se espalhar por múltiplas
instituições; por protocolos e serviços que permitam o acesso remoto seguro a dados e a recursos
computacionais; mecanismos que ofereçam informação e permitam a configuração de serviços e
recursos; e finalmente serviços de gerenciamento de dados que permitam a localização e o
transporte de conjuntos de dados entre sistemas de armazenamento e aplicações.
Portanto, o estabelecimento, gerenciamento e uso intensivo de relações de compartilhamento
requer uma nova tecnologia. Foster estrutura a discussão desta tecnologia em termos de uma
arquitetura do Grid, que identifica os componentes fundamentais do sistema, seu propósito e função
e como ocorre sua interação[11].
A operação efetiva de uma organização virtual requer a possibilidade do estabelecimento de
relações de compartilhamento entre quaisquer participantes. Portanto, interoperabilidade é um tema
central. Em um ambiente de rede, interoperabilidade significa protocolos comuns. Logo, a
arquitetura do Grid, é primeiramente e acima de tudo, uma arquitetura de protocolos.
A definição de um protocolo (1)especifica como os elementos de um sistema distribuído
interagem uns com os outros a fim de alcançar um comportamento especifico e (2)a estrutura da
informação trocada durante esta interação. Uma vez que os protocolos governam a interação entre
os componentes, e não a interação desses componentes, o controle local e preservado.
Os protocolos definem mecanismos para negociar, estabelecer, gerenciar e utilizar as relações
de compartilhamento que definem as organizações virtuais. Esses protocolos devem idealmente
serem abertos e seguir padrões. Como já foi parcialmente mencionado, os padrões permitem
extensibilidade, interoperabilidade, portabilidade e compartilhamento de código.
E necessário garantir que as relações de compartilhamento sejam iniciadas entre partes
arbitrarias, acomodando novos participantes dinamicamente, diversas plataformas, idiomas e
ambientes de programação. Neste contexto os mecanismos são de pouca utilidade se não forem
20
definidos e implementados para operar além dos limites organizacionais, políticas operacionais e
tipos de recursos.
Além de protocolos, compõem a arquitetura os pacotes de desenvolvimento de software (SDK's
– Software Development Kits) e interfaces de programação de aplicações (API's – Application
Programming Interfaces).
Outra característica presente em um ambiente de grid computacional adequado é a possibilidade
de se coordenar processos e tarefas através de múltiplos recursos. Esta característica é chamada co-
escalonamento (coscheduling).
3.4 Descrição da arquitetura do grid
A arquitetura do Grid e definida em camadas. Nas camadas inferiores há um numero reduzido
de abstrações e protocolos, sobre as quais são implementados os comportamentos de alto nível[12].
Em cada camada tem-se protocolos bem definidos que provem acesso a alguns serviços úteis,
como por exemplo, descobrimento e gerenciamento de recursos, acesso a dados, entre outros. API's
também podem estar presentes nestas camadas, em cuja implementação esta definida a troca de
mensagens de protocolo com os serviços apropriados para a execução das ações desejadas.
Para completude, existem ainda protocolos inter-grid, que permitem a interoperabilidade entre
diferentes tecnologias de grid.
Uma variedade de recursos é definida na camada Fabric. Sobre esta camada os protocolos de
recursos e conectividade (Resource and Connectivity) facilitam o compartilhamento de recursos
individuais. Finalmente, na camada coletiva (Collective) podem ser construídos uma variedade de
serviços globais e comportamentos específicos de aplicações. Esta camada tem este nome pois
envolve o uso coordenado de múltiplos recursos.
A figura seguinte mostra a arquitetura das camadas do protocolo do Globus Toolkit e as
interações entre elas.
21
3.4.1 Fabric: interfaces para controle local
A camada Fabric e que, em primeira instância, disponibiliza os recursos compartilhados. Um
recurso pode ser uma entidade lógica, como um sistema de arquivos distribuído, um cluster
computacional ou um conjunto distribuído de computadores. Os componentes da camada Fabric
implementam as operações locais, especificas a cada um dos recursos, sejam elas operações físicas
ou lógicas. Existe uma relação entre as funções implementadas pela camada Fabric e as operações
de compartilhamento. Funcionalidades melhores nesta camada permitem operações de
compartilhamento mais sofisticadas. Por exemplo, o suporte a reservas antecipadas de recursos
neste nível, permitem a serviços em camadas superiores efetuar o “co-escalonamento”, ou seja, a
agregação de recursos para o cumprimento de determinada tarefa.
Foster afirma que os recursos devem, no mínimo, implementar mecanismos de consulta, que
permitam descobrir sua estrutura, estado e capacidades, e de gerenciamento, proporcionem algum
controle da qualidade de serviço.
3.4.2 Conectividade: comunicando-se de forma segura e efetiva
A camada de conectividade define o cerne dos protocolos de comunicação e autenticação
necessários para as transações de rede especificas ao Grid. Os protocolos de comunicação permitem
a troca de dados entre os componentes da camada Fabric. Os protocolos de autenticação atuam
sobre os protocolos de comunicação e oferecem serviços para verificar a identidade de usuários e de
recursos.
22
Figura 1 - Camadas da arquitetura de protocolo doGlobus
Os requisitos colocados para comunicação incluem transporte, roteamento e nomeação. Esses
protocolos são baseados na pilha de protocolos TCP/IP, mais especificamente nas camadas de rede
(IP, ICMP), transporte(TCP, UDP) e aplicação(DNS, OSPF, RSVP)[13].
Os aspectos de segurança da camada de Conectividade devem, na medida do possível, serem
baseados em padrões vigentes.
3.4.3 Recursos: compartilhando recursos individuais
Os protocolos da camada de Recursos são responsáveis por negociar, iniciar, monitorar,
controlar, auditar e finalmente efetuar o “pagamento” das operações de compartilhamento. São
encarregados apenas de recursos individuais e ignoram completamente questões de atomicidade e
estado global de coleções distribuídas, isso é tarefa da camada Coletiva.
Estes protocolos fazem chamadas a funções implementadas pela camada Fabric. Os mecanismos
desejáveis da camada Fabric sumarizam as características principais requeridas dos protocolos da
camada de Recursos.
Há duas classes primárias de protocolos na camada de Recursos: protocolos de informação e
protocolos de gerenciamento.
3.4.4 Coletiva: coordenando recursos múltiplos
Esta camada não se associa a um recurso especifico mas captura as interações entre coleções de
recursos.
Como esta camada esta posicionada no topo da pilha de protocolos ela pode implementar uma
ampla variedade de comportamentos de compartilhamento sem que seja necessária a especificação
de novos requisitos aos recursos sendo compartilhados. Ela se utiliza das funcionalidades oferecidas
pelas camadas inferiores.
3.4.5 Aplicações
A última camada na arquitetura do Grid compreende as aplicações. de usuários que operam no
ambiente de uma Organização Virtual. As aplicações. são construídas em termos de (e efetuam
chamadas aos) serviços implementados em qualquer camada.
23
3.5 Segurança em ambientes de grid computacional
Questões de segurança na arquitetura de grid computacional proposta pelo OGSA e
implementada pela OGSI são tratados de forma bastante sofisticada.
Organizações Virtuais que utilizam o middleware Globus têm a sua disposição um módulo para
a implantação de uma autoridade certificadora para emissão de certificados a usuários autorizados a
utilizar os serviços do ambiente e hosts autorizados a oferecer os recursos.
3.6 Comentários sobre JAVA, JINI, CORBA e DCOM
Poderia ser questionado se outras tecnologias para computação distribuída não seriam soluções
para os problemas que o grid se propõe a solucionar. O argumento conclusivo é que estas
alternativas não enfrentam adequadamente todos os desafios aos quais o grid se prontifica.
Java oferece tecnologia para o desenvolvimento orientado a objetos de aplicações portáveis[8].
CORBA (Common Object Request Broker Architecture) define uma Linguagem de Definição
de Interfaces (IDL) para interoperabilidade entre linguagens, um serviço de chamadas de
procedimentos remotos e outros serviços especializados, como um corretor para localização de
recursos.
DCOM (Distributed Component Object Model) da Microsoft oferece diversos serviços como
chamadas a procedimentos remotos, serviço de diretórios e um sistema de arquivos distribuído.
Porém todas essas tecnologias não lidam diretamente com a questão de alta performance e
problemas decorrentes da heterogeneidade desta classe de ambientes distribuídos.
3.7 Questões referentes aos ambientes de grid computacional
“O Grid é a próxima geração da Internet”[9].
“O Grid é uma fonte para poder de processamento gratuito”.
Uma idéia equivocada referente aos recursos ociosos em um ambiente de grid computacional é
acreditar que eles estarão publicamente disponíveis. Essa crença é alimentada pela mídia quando
afirma que os ambientes de grid computacional são a nova geração da Internet. Os recursos
computacionais não permanecem publicamente disponíveis como arquivos ou páginas web em
servidores FTP ou HTTP. Cada ponto em um grid mantém controle sobre o acesso aos seus
recursos. Ao instalar os componentes do grid o administrador do sistema cria um arquivo de
mapeamento que contem relações entre as credenciais de grid e contas de usuário locais. As únicas
24
pessoas autorizadas a submeter tarefas aos recursos são aquelas cujas credenciais de grid estão
listadas no arquivo de mapeamento. Todas as submissões são registradas localmente via syslog.
“O Grid torna os supercomputadores monolíticos supérfluos.”
A categoria de aplicações que são passíveis de serem executadas em um grid são fracamente
acopladas, data intensive (cálculos computacionais intensivos) e que dependam pouco de
comunicação via rede. O grid não irá substituir os supercomputadores, será mais uma alternativa
para uma determinada categoria de problemas.
3.8 Web Services
O termo Web Services surgiu no ano de 2000 com a introdução de tecnologias como SOAP,
WSDL e UDDI. Mais recentemente o termo Arquitetura Orientada a Serviços (SOA – Service
Oriented Architecture) foi cunhado para descrever a abordagem completa da construção de sistemas
distribuídos fracamente acoplados, com um conhecimento mínimo compartilhado entre os
componentes do sistema[14].
De acordo com o Grupo de Trabalho de Arquitetura de Web Services do W3C (W3C Web
Services Architecture Working Group – WS-ARCH):
“ Um Web Service é um sistema de software desenvolvido para dar suporte a interação de
máquinas através de uma rede. Possui uma descrição de interface passível de
processamento escrita em WSDL. Outros sistemas podem interagir com o Web Service da
maneira descrita pela sua interface usando mensagens SOAP, tipicamente transportadas
usando HTTP e serialização XML, em conjunto com outros padrões relacionados a Web.”
Uma arquitetura orientada a serviços define um sistema distribuído no qual agentes, chamados
serviços, são coordenados pelo envio e recebimento de mensagens. Citando o WS-ARCH
novamente:
“ Uma SOA é um tipo específico de sistema distribuído no qual os agentes são serviços.
Um serviço é um agente de software que executa operações bem definidas (isto é, fornece
um serviço) e pode ser invocado fora do contexto de um aplicação maior. (...) Os seus
usuários devem se preocupar apenas com a descrição da interface do serviço. Os serviços
possuem interfaces endereçáveis e se comunicam através de protocolos e formatos de
dados padrão.
25
A grosso modo, Web Services representam apenas mais uma tecnologia de computação
distribuída, como CORBA (Common Object Requestor Brokering Architecture), RMI (Remote
Method Invocation) e EJB (Enterprise Java Beans). Esta tecnologia permite a criação de
aplicações que sigam o paradigma de programação cliente/servidor[15].
Um exemplo simples de um Web Service seria um repositório de dados que é acessado
remotamente por computadores clientes, em localizações remotas, com sistemas operacionais
possivelmente diferentes e arquiteturas distintas. Os clientes efetuam uma requisição de serviço, o
servidor pode efetuar alguma computação sobre os dados e retornar um resultado. Ou ainda um
serviço de consulta a previsão do tempo ou de análise de uma carteira de ações fictícia. A figura
seguinte exemplifica o processo de invocação de um web service.
Apesar desta descrição também poder conceituar uma página web, a diferença está no fato de
que estas páginas apresentam informações para que pessoas possam ler. A informação disponível
através de um Web Service é única e exclusivamente acessada por um programa, nunca diretamente
por uma pessoa. Apesar dos Web Services contarem com tecnologias Web amplamente difundidas
(HTTP, por exemplo), não há, necessariamente, relação com navegadores Web ou HTML. A
próxima figura mostra a arquitetura de um web service.
26
Figura 2 - Exemplo de invocação de um web service
Existem algumas vantagens na utilização de Web Services em detrimento de outras tecnologias,
como CORBA, RMI e EJB. Podem ser citadas[15]:
• Web Services são independentes de plataforma e linguagem, pois utilizam o padrões
XML. Isto significa que um programa cliente pode ser programado em C++ e ser
executado no Microsoft Windows, enquanto o Web Service pode ser programado em
Java e ser executado em Linux.
• Web Services utilizam o protocolo HTTP para transmissão de mensagens. Isto é uma
vantagem caso se deseje desenvolver aplicações para uso na Internet.
A fim de desmistificar a euforia que existe em torno da utilização de Web Services, podem ser
citadas algumas desvantagens da sua utilização[15]:
• Overhead. A transmissão de todos os dados em um formato XML não é tão eficaz
quanto utilizar um código binário proprietário. O que se ganha em portabilidade, perde-
se em eficiência. Mesmo assim, este overhead é aceitável para a maioria das aplicações,
mas provavelmente não será utilizado em aplicações críticas em real-time.
• Versatilidade deficiente. Atualmente, Web Services não é uma tecnologia versátil, pois
permite apenas formas básicas de invocação de serviços. CORBA, por exemplo, oferece
aos programadores diversas funcionalidades, como persistência, transações,
gerenciamento de ciclo de vida, etc.
27
Figura 3 - Arquitetura de um webservice
Existe ainda um outra característica que distingue os Web Services. Enquanto CORBA e EJB
são orientado para sistemas distribuídos fortemente acoplados, onde cliente e servidor são muito
dependentes um do outro, os Web Services são orientados a sistemas fracamente acoplados. O
cliente não precisa ter um conhecimento prévio do Web Service até que faça a sua invocação.
Sistemas fortemente acoplados são ideais para aplicações em redes locais. Os Web Services, no
entanto, atendem muito bem aos requisitos e aplicações Internet, como aquelas utilizadas em
ambientes de Grid Computacional.
Apesar dos web services se apresentarem, em tese, como uma boa solução para equacionar o
problema de executar aplicações sobre a infra-estrutura da Internet usando clientes e servidores
fracamente acoplados, eles não possuem determinadas características importantes para serem
considerados um solução definitiva.
Quando uma série de transações deve ser executada, freqüentemente, o resultado de uma etapa é
utilizado em etapas subseqüentes. Por exemplo, operações em um banco de dados ou cálculos
matemáticos. Um web service não tem a capacidade de armazenar essas informações entre uma
invocação e outra. Ou seja, eles não armazenam informações de estado, são stateless.
Quando dois usuários acessam uma página da Internet com conteúdo dinâmico, a funcionalidade
do servidor que previne que o conteúdo de um usuário seja apresentado a outro é chamada de
controle de sessão. Após sua invocação por um cliente, a informação que foi utilizada continua
disponível no Web Service mesmo após o término de uma invocação, criando problemas de
segurança e continuidade. A priori, um web service não mantém esse tipo de controle, os web
services são “não-transientes.”
Para solucionar problemas como os apresentados acima surgiram os grid services, com
aprimoramentos que os tornam adequados para o suporte à aplicações em ambientes de grid
computacional.
28
A forma encontrada para aprimorar os web services passa pelo emprego de idéias comuns à
engenharia de software, os design patterns. A proposta foi utilizar o Factory Pattern, que permite
criar uma instância do web service para cada invocação de cliente.
Essas características importantes para que os web services sejam utilizados em ambientes de
grid computacional devem ser incorporadas na versão 2.0 da WSDL. Portanto no futuro não haverá
diferença entre web services e grid services.
29
Figura 4 - Componentes de um Grid Service
4 Projeto e ambiente de desenvolvimento
A implementação de aplicações para ambientes de grid computacional utilizando web
services, ou Grid Services, pode seguir duas abordagens: herdar características de uma classe
esqueleto ou usar um modelo de delegação, no qual as solicitações são delegadas a algumas classes
chamadas provedores de operações[16].
Neste trabalho a aplicação desenvolvida irá herdar toda a funcionalidade necessária para operar
em um ambiente de grid computacional da API oferecida pelo framework do Globus Toolkit. Para
este trabalho foi desenvolvido um exemplo de Grid Service. A aplicação desenvolvida é capaz de
efetuar operações aritméticas simples.
O desenvolvimento de um Grid Service pode ser dividido em etapas[17]:
• Especificar uma interface de serviços;
• Gerar código de suporte ao Grid Service;
• Implementar o serviço;
• Distribuir o serviço.
Cada uma dessas etapas será explicada separadamente.
4.1 Especificar uma interface de serviços
O primeira etapa ao desenvolver um Grid Service é especificar a sua interface de serviço, ou
PortType[15]. Inicialmente não é necessário saber os detalhes do serviço, ou seja, que algoritmos
serão utilizados ou quais bancos de dados serão acessados, apenas o que este serviço irá oferecer.
Aqui são definidos os métodos ou funções utilizados pelo serviço e quais parâmetros eles
recebem.
Esta especificação é escrita usando um tipo de XML, o WSDL (Web Services Description
Language). Duas abordagens podem ser utilizadas: definir a interface em JAVA e gerar a interface
em WSDL ou escrever diretamente a interface em WSDL.
Escrever a interface em JAVA e gerar seu equivalente em WSDL é mais fácil, porém há um
inconveniente. Quando são utilizados tipos complexos de dados, diferentes dos tipos padrão do
JAVA, como int, float e char, podem ocorrer inconsistências no mapeamento da interface JAVA e
WSDL. Portanto, é aconselhável escrever a interface diretamente em WSDL, usando a sintaxe
30
GWSDL (Grid Web Service Description Language). A diferença entre Web Services e Grid
Services reside basicamente nas pequenas diferenças entre a sintaxe WSDL e GWSDL, em outras
palavras, nos aprimoramentos do GWSDL. Lembrando que o GWSDL é uma solução temporária,
enquanto a versão 2.0 do WSDL não é homologada pelo W3C.
A geração de uma interface WSDL é feita usando-se uma ferramenta chamada Apache Axis
JAVA2WSDL.
Exemplos de interfaces definidas tanto em JAVA quanto em WSDL/GWSDL podem ser
encontradas nos anexos sob os títulos Math.java e MathService.wsdl.
4.2 Gerar código de suporte ao Grid Service
Da mesma forma que em outras tecnologias para computação distribuída, como RMI, CORBA e
EJB, os Web Services contam com o uso de stubs[15]. Os stubs são componentes de software
responsáveis por toda a comunicação de rede e pela manipulação das mensagens SOAP.
O framework Globus Toolkit prevê dois modelos de desenvolvimento de Grid Services, top
down e bottom up. No modelo top down parte-se de uma interface escrita em WSDL e no modelo
bottom up o primeiro passo é a interface JAVA. Em ambos os modelos o resultado final desta etapa
é um conjunto interfaces compatíveis com o padrão JAX-RPC (JAVA API for XML-based RPC),
usado para realizar um mapeamento entre os tipos XML e os tipos do JAVA mantendo a
funcionalidade proporcionada pelas chamadas a procedimentos remotos.
Nos anexos, sob os títulos MathPortType.java, MathServiceGridLocator.java,
MathService.java, MathServiceLocator.java e MathServiceSoapBindingStub.java podem ser
31
Figura 5 - Modelos de desenvolvimento de Grid Services
vistos exemplos de stubs que posteriormente serão incorporados aos programas cliente e servidor da
aplicação.
4.3 Implementar o serviço
O primeiro etapa na implementação de um Grid Service, e o que de fato o torna uma aplicação
desta categoria, é a inclusão de classes que lhe emprestem funcionalidade para responder chamadas
de procedimentos remotos, criação e destruição de instâncias, manipulação de mensagens SOAP.
Estas classes foram geradas na etapa anterior e também são oferecidas pelo framework[15].
No serviço desenvolvido neste trabalho são explicitamente feitas duas inclusões no código
principal do serviço: GridServiceImpl e MathPortType.
Em seguida é necessário escrever um construtor para o serviço. E finalmente são implementados
os métodos descritos na interface (JAVA ou WSDL).
O código completo da aplicação pode ser encontrado nos anexos sob o título MathImpl.java.
4.4 Distribuir o serviço
Até este ponto tem-se uma interface de serviço escrita em JAVA, seu equivalente escrito em
WSDL, vários arquivos que formam os stubs e a implementação propriamente dita do serviço. A
última etapa é agrupar todos estes componentes e torná-los disponíveis em um servidor web que
seja habilitado para operar em um ambiente de grid computacional. Esta etapa é chamada de
distribuição (deployment).
Para maior compreensão pode-se ainda dividir esta etapa em três tarefas[17]:
• escrever um descritor de distribuição;
• incluir todos os arquivos em um pacote gar;
• instalar o pacote gar em um GSHE (Grid Service Hosting Environment), ou seja um
servidor web habilitado a operar um ambiente de grid computacional.
Um dos componentes chave desta fase de distribuição do serviço é um arquivo chamado
descritor de distribuição (deployment descriptor)[15]. Este arquivo orienta o servidor web, GSHE,
na maneira que deve publicar o Grid Service. O descritor de distribuição é escrito em uma
linguagem chamada WSDD (Web Services Deployment Descriptor).
32
O descritor de distribuição da aplicação deste projeto pode ser encontrado sob o título
Math.wsdd junto aos anexos.
Na tabela abaixo são apresentados os parâmetros reconhecidos pelo GSHE do framework
Globus Toolkit:
<service name= nome>
Aqui é definido o nome pelo qual o serviço seráacessível. Terá o formato <URL no ambiente dogrid>/nome, o formato da URL é tipicamentehttp://<host>:<porta>/ogsa/services
<parameter name= “name”...> Uma descrição do serviço. (opcional)
<parameter name= “className”...> O parâmetro className especifica uma classe ouinterface que possui métodos públicos emcorrespondência com todas as operações wsdl.
<parameter name= “baseClassName”...> Especifica o nome da classe principal que implementao Grid Service. Se é idêntico ao className pode serignorado. (opcional)
<parameter name= “operationProviders”...> A lista de classes que devem ser carregadas comoprovedores de operações. A ordem de listagem dosprovedores é a mesma em que eles devem sercarregados. (opcional)
<parameter name= “persistent” ...> Este parâmetro diferencia o grid service dos webservices comuns em execução no servidor. Se esteparâmetro não estiver presente o grid service serátratado como um web service comum.
<parameter name= “schemaPath”...> Indica ao framework a localização do arquivo deinterface de serviço WSDL.
<parameter name= “instance schemaPath”...> No caso de um grid service que utiliza o padrãofactory é necessário indicar neste parâmetro alocalização do arquivo de interface do serviço que iráser criado.
<parameter name= “handlerClass”...> Indica o nome da classe que efetua despachos, no casodo Globus éorg.globus.ogsa.handlers.RPCURIProvider
<parameter name= “factoryCallBack”...> Este parâmetro aponta para uma classe queimplementa a interface usada para criar instâncias deserviços.
Tabela 1 - Parâmetros WSDL
A segunda tarefa a ser executada nesta etapa de distribuição do serviço é incluir os arquivos em
um pacote gar. O Globus Toolkit utiliza o Apache Ant para automatizar este processo.
Apache Ant é uma ferramenta para fazer o build de aplicações baseadas em JAVA compostas
por múltiplos arquivos. Funciona da mesma forma que o Make para aplicações baseadas em C ou
C++. O Make funciona utilizando Makefiles, o Ant opera seguindo as instruções contidas em
arquivos build.xml.
33
A inclusão dos arquivos do Grid Service em um pacote gar é descrita no arquivo build.xml que
se encontra nos anexos.
A terceira etapa, instalação do pacote gar no ambiente de grid computacional, também será
executada e automatizada em conjunto pelo Ant. A descrição desta etapa está no mesmo arquivo
build.xml.
4.5 Um cliente para testar o Grid Service
Afim de testar o Grid Service apresentado serão utilizados dois cliente. O primeiro para
demonstrar a possibilidade de se criar instâncias distintas a cada invocação do Grid Service. O
segundo cliente demonstra característica de memória de estado de um Grid Service, a cada execução
do cliente o valor de uma variável é incrementado em seu valor anterior[15].
Para escrever um cliente basta incluir as classes que formam os stubs e o GSH do serviço. GSH
é o Grid Service Handle, o nome dado para a URL (Uniform Resource Locator) única de cada Grid
Service.
O código dos clientes pode ser verificado nos anexos sob os nomes MathClient.java e
MathClient2.java.
34
5 Decisões de projeto
A seguir serão apreentadas alguns argumentos que justificaram as escolhas das plataformas de
software e hardware utilizadas para este projeto.
5.1 Linguagem JAVA
O desenvolvimento das aplicações poderia ser feito em Python, CORBA, Perl ou mesmo
Matlab, mas por diversas razões foi utilizada a linguagem JAVA. Gregor Lawszweski sintetiza
muito bem os motivos que justificam a escolha de JAVA como opção para o desenvolvimento de
aplicações para ambientes de Grid Computacional[16].
• A linguagem: Java como uma linguagem de programação possui algumas
características fundamentais de suporte à engenharia de software para projetos de larga
escala como empacotamento(JAR), abordagem orientada a objeto, herança simples,
coleta de lixo e tipos de dados unificados. Ainda, como o suporte a threads e
mecanismos de controle de concorrência fazem parte da linguagem, existe a
possibilidade de expressar paralelismo diretamente no mais baixo nível de usuário.
• Biblioteca de classes: Java oferece uma ampla variedade de bibliotecas de classe
incluindo funções essenciais, como a comunicação através de sockets e acesso via SSL.
• Componentes: uma arquitetura de componentes é fornecida pelos JavaBeans e
Enterprise JavaBeans, permitindo o desenvolvimento de programas baseados em
componentes.
• Implantação: o bytecode Java permite implantação simples através de navegadores
web.
• Portabilidade: “escreva uma vez, execute em qualquer lugar.”
• Manutenção: Java contem uma ferramenta para geração automática de documentação,
além disso componentes escritos como JavaBeans podem ser integrados em IDEs
comerciais.
35
• Desempenho: Fornecedores de software demonstraram que o desempenho em
aplicações específicas pode se aproximar de C ou FORTRAN.
• Dispositivos: Smart cards baseados em Java, PDAs e dispositivos inteligentes podem
proporcionar uma expansão do ambiente para cientistas usando o Grid.
• A Indústria: o suporte da indústria de TI torna Java merecedora de atenção no
momento da escolha de um ambiente para o desenvolvimento de aplicações para o Grid.
• A Comunidade: inúmeras universidades no mundo estão ensinando Java aos seus
estudantes.
5.2 Sistema operacional GNU/Linux
Outra escolha que poderia ser feita é quanto ao sistema operacional. Para as tarefas de
desenvolvimento e teste poderia ser utilizado qualquer sistema UNIX-like ou Microsoft Windows.
Porém para que o ambiente anfitrião e softwares servidores pudessem ser executados havia a
necessidade de ser um sistema UNIX-like, esta é uma limitação que está sendo corrigida e em
versões futuras o Globus Toolkit poderá ser executado em qualquer plataforma.
Sendo assim, o sistema operacional escolhido foi o GNU/Linux.
5.3 Middleware Globus Toolkit
A construção de Grids Computacionais não é uma tarefa simples. Pode-se destacar três
características que corroboram o fato:
• Grids são potencialmente muito grandes;
• Grids são heterogêneas em múltiplos níveis. Os recursos de hardware que formam o
núcleo dos grids computacionais são muito heterogêneos, os computadores, dispositivos
de armazenamento, redes, etc. No âmbito do software, linguagens ou paradigmas de
programação, versões de sistemas operacionais, bibliotecas e compiladores também
tornam os sistemas computacionais essencialmente diferentes. Recursos como bancos
de dados adicionam heterogeneidade no âmbito das aplicações. Finalmente, a
propriedade destes recursos está distribuída por diversos domínios administrativos, o
que resulta em heterogeneidade em políticas de administração destes recursos.
36
• Grids são altamente dinâmicas. Os múltiplos domínios administrativos contribuem para
esta característica. A disponibilidade de recursos se altera em uma base contínua a
medida que eles são adicionados, removidos, atualizados e movimentados no interior do
grid. Finalmente, a falha de recursos é a regra e não a exceção.
Os ambientes de grid computacional existentes atualmente são resultado de iniciativas para a
elaboração de middleware que permita sua configuração. Seu objetivo é conectar redes,
workstations, computadores pessoais ou quaisquer outros recursos em um sistema que permita a
abstração de arquiteturas diferentes, sistemas operacionais ou localização física. Cada recurso é um
elemento independente, podendo atuar ora como servidor, ora como cliente.
Middleware são programas que conectam duas ou mais aplicações através de uma rede. Mais
especificamente, o termo se refere a uma camada de serviços que reside entre a rede e aplicações
para o gerenciamento de recursos e dados, localização destes recursos, acesso e segurança.
As iniciativas mais significativas no desenvolvimento de middleware para a construção de
ambientes de grid computacional são o Condor-G, o Legion e o Globus Toolkit.
Neste trabalho será utilizado o Globus Toolkit para a construção de um ambiente de grid
computacional. Este ambiente será utilizado para demonstrar como aplicações podem utilizar
conceitos de web services, como a WSDL (Web Services Definition Language), para usufruir da
infra-estrutura criada por grids.
O Globus Toolkit é um conjunto de componentes que podem ser utilizados tanto
independentemente quanto juntos. É desenvolvido sob uma licença GPL, é software livre, e usado
como base para diversos produtos comerciais. Atualmente o Globus Toolkit é o padrão da indústria
para a implantação de testbeds (ambientes de teste) de grid computacional. Sua construção é
orientada por padrões que são adotados por outras arquiteturas de grid. Esses padrões são descritos
em duas publicações, Open Grid Services Architecture e Open Grid Services Infrastructure.
Os serviços oferecidos pelo GT3 são apresentados por interfaces que estão em conformidade
com a OGSI (Open Grid Services Infrastructure). Apesar destas interfaces serem implementadas
em Java, os serviços ainda apresentam alto desempenho, pois seu back-end é codificado em C.
5.3.1 O que é o Globus Toolkit
Um conjunto de serviços e bibliotecas de software para dar suporte a Grids e aplicações de
Grids. Há software para segurança, infraestrutura de informação, gerenciamento de recursos,
gerenciamento de dados, comunicação, detecção de erros e portabilidade.
37
Há um conjunto de componentes que compõe o núcleo do Globus, estes componentes serão
descritos em seguida. Para cada um há uma API (Application Programmer Interface - Interface de
Programação de Aplicação) codificada em C e ferramentas de linha de comando. Para algumas há
classes em Java.
Além destes componentes do núcleo há protótipos de componentes de alto nível e serviços.
Finalmente existe um grande número de iniciativas para o desenvolvimento de frameworks e
aplicações científicas e de engenharia.
5.3.2 Componentes do núcleo do Globus Toolkit
Globus Resource Allocation Manager (GRAM) permite alocação de recursos e criação de
processos, monitoramento e gerenciamento de serviços. Sua tarefa é repassar requisições expressas
em uma Linguagem de Especificação de Recursos (RSL - Resource Specification Language) em
comandos para computadores e escalonadores locais.
Grid Security Infrastructure (GSI) oferece um esquema de autenticação única com suporte a um
controle local de permissões de acesso e mapeamento de usuários do Grid para identidades locais.
Permite a utilização de smart cards.
Monitoring and Discovery Service (MDS) é um serviço de informação que combina
mecanismos de descoberta de dados com LDAP (Lightweight Directory Access Protcol). Permite
acesso homogêneo a, por exemplo, configuração de servidores, status de rede ou localização de
conjuntos de dados replicados.
Global Access Secondary Storage (GASS) permite leitura e escrita de dados locais a programas
sendo executados em localidades remotas.
Heartbeat Monitor (HBM) permite a detecção de falhas em componentes do sistema ou
processados por administradores de sistemas e usuários comuns.
5.4 Ambiente de desenvolvimento
O ambiente de hardware e software utlizado é descrito nas seções seguintes.
5.4.1 Hardware
O sistema computacional utilizado para realizar os testes está descrito abaixo:
38
ProcessadorIntel Pentium IV HyperThreading com SMP
habilitado, o que permitiu ao kernel do sistemaoperacional identificar uma máquina com dois
processadores.
Memória secundária 80 GB
Memória principal 512 MB DDR 400MHz
Tabela 2 - Configuração de hardware utilizada
5.4.2 Software
O software utilizado para desenvolvimento de aplicações e realização de testes está descrito
abaixo:
Sistema operacional GNU/Linux
Kernel 2.4.22 SMP
Linguagem de desenvolvimento JAVA 1.4.2_02
Middleware de Grid Globus Toolkit v.3.0.2
IDE VIM – Vi IMproved
Build Tool Apache Ant 1.5.4
Tabela 3 - Configuração de software utilizada
39
6 Trabalhos futuros e conclusão
Nas seções seguintes orientações para trabalhos futuros e a conclusão.
6.2 Trabalhos futuros
Uma das possibilidades mais fascinantes da pesquisa com grids é a possibilidade de poder trazer
todo o poder computacional para dentro de dispositivos móveis como PDA's ou telefones celulares.
Este avanço é possível e já existem tecnologias que permitem que este salto seja dado.
O protocolo SyncML permite a sincronização de dispositivos móveis com servidores através de
protocolo WAP, SMS ou GPRS. Estes pontos de acesso poderiam estar presentes em Grid Portals,
que são interfaces Web para os recursos de um ambiente de Grid Computacional. Diversas artigos
documentam a criação e manutenção de um Grid Portal.
Grid computacionais também poderiam ser acessadas a partir de qualquer ponto de conexão
com a Internet e a autenticação e subseqüente autorização poderia ser garantida e verificada por
smart cards. O suporte a esses dispositivos já existe na GSI.
Outro rumo que a pesquisa poderia tomar é no desenvolvimento de infraestruturas para o
gerenciamento e acesso de alto desempenho a grandes quantidades de dados (terabytes ou
petabytes).
E finalmente o aprimoramento da infraestrutura de gerenciamento de recursos para suporte ao
monitoramento fim a fim e tolerância a falhas através de um escalonamento de rede, agendamento
antecipado ("advance reservations") e autorização baseado em políticas.
6.1 Conclusão
Toda nova tecnologia atravessa um Ciclo de Euforia[18] composto por cinco fases: novidade,
euforia, desilusão, esclarecimento e produtividade. Isso não é diferente com a tecnologia que
envolve a construção e operação dos ambientes de grid computacional, que nessa etapa se encontra
muito próxima do pico de euforia.
Porém a possibilidade e realizar efetiva computação colaborativa, computação de alto
desempenho a um custo reduzido, outsourcing de recursos computacionais e os benefícios que
diversos ramos da indústria e ciência podem vir a usufruir, exigem que o papel da comunidade de
cientistas da computação seja no sentido de torná-la uma tecnologia produtiva o mais brevemente
possível.
40
Os esforços na definição de padrões estão sendo liderados pelo Global Grid Forum, que
contribui com uma infraestrutura que já é utilizada de fato em aplicações de mercado e centros de
pesquisa, o Globus Toolkit. Numerosos desenvolvedores estão se dedicando à tarefa de tornar cada
vez mais fácil e rápido o desenvolvimento de novas aplicações e a migração de sistemas legados
para este novo paradigma.
Neste trabalho foi construído e configurado com exito um ambiente de grid computacional; foi
desenvolvida uma aplicação exemplo e definidas linhas mestras para o desenvolvimento futuro de
outras aplicações mais complexas. Deve ser visto como uma introdução ao desenvolvimento de
aplicações nesta área resultante da convergência da computação distribuída e da computação de alto
desempenho. O tema já ensinado em universidades brasileiras e constantemente visitado por artigos,
tutoriais e workshops nos congressos de computação.
A plataforma de software para operação dos ambientes de grid computacional é em grande parte
oferecida sob a licença de software livre ou bastante permissivas garantindo que governos,
instituições e empresas tenham acesso à tecnologia.
Assim é apenas uma questão de tempo para sua popularização e adoção em ambientes diversos.
41
Referências bibliográficas
[1] CERN, Grid Café, 2003, http://gridcafe.web.cern.ch/gridcafe.
[2] Alvarenga, Anderson T. H.; Dissertation; Um ambiente para processamento paralelo
oportunístico na Internet, 2003
[3] Silberschatz, A.; Peterson, J., Operating Systems Concepts, 1985.
[4] Grimshaw, Andrew S.; Article; Metasystems: An Approach Combining Parallel Processing
and Heterogeneous Distributed Computing Systems.
[5] Buyya, Rakumar, GRIDInfoware, 2003, http://www.gridcomputing.com.
[6] Shirky, Clay, What is P2P...and what isn't?, 2000, http://www.openp2p.com.
[7] Cirne, Walfredo; Article; Grids Computacionais: Arquiteturas, Tecnologias, Aplicações.
[8] Globus Alliance, Globus FAQ, 2003, http://www.globus.orb/about/faq.html.
[9] Foster, I.;Tuecke, S.; Journal; The Anatomy of the Grid: Enabling Scalable Virtual
Organizations, 2001.
[10] Leinberber, W.; Article; Information Power Grid: The New Frontier in Parallel Computing?.
[11] Foster, I.; Kesselman, J.; Nick J.; Tuecke, S.; Article; The Phisiology of the Grid: An Open
Grid Services Architecture for Distributed Systems Integration.
[12] Tuecke, S.; Czajkowski, K.; Foster, I.; Frey, J.; Graham, S.; Kesselman, C.; Maguire, T.;
Sandholm, T.; Vanderbilt, P.; Snelling, D.; Techn. documentation; Open Grid Services
Infrastructure. 2003.
[13] Dantas, M.A.R., Tecnologias de Redes de Comunicação e Computadores, 2002.
[14] Foster, I.; Frey, J.; Graham, S.; Tuecke, S.; Czajkowski, K.; Ferguson, D.; Leymann, F.; Nally,
M.; Storey, T.; Vambenepe, W.; Weerawarana, S.; Article; Modeling Stateful Resources with Web
Services.
[15] Sotomayor, B., The Globus Toolkit 3 Programmer's Tutorial, 2003, http://www.casa-
sotomayor.net/gt3-tutorial.
[16] Laszewski, G.; Foster, I.; Gawor, J.; Lane, P.; Article; A Java Commodity Grid Kit.
[17] Globus Alliance; Techn. documentation; Java Programmer's Guide Core Framework. 2003.
[18] Gartner Group, Hype Cycles, 1995, http://www.gartner.com/pages/story.php.id.8795.s.8.jsp.
42
ANEXOS
Nos itens seguintes e apresentada a listagem dos códigos fontes da aplicação exemplo
desenvolvida neste trabalho.
Math.java
package gt3tutorial.core.factory.impl;
public interface Math{ public void soma(int a); public void subtracao(int a); public int getValue();}
MathService.wsdl
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions targetNamespace="http://first.core.gt3tutorial/Math"
xmlns="http://schemas.xmlsoap.org/wsdl/"xmlns:apachesoap="http://xml.apache.org/xml-soap"xmlns:gridservicesoapbinding="http://www.gridforum.org/namespaces/2003/03/OGSI/bindings" xmlns:impl="http://first.core.gt3tutorial/Math"xmlns:intf="http://first.core.gt3tutorial/Math"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"><wsdl:importlocation="../schema/ogsi/ogsi_bindings.wsdl"namespace="http://www.gridforum.org/namespaces/2003/03/OGSI/bindings"/>
<wsdl:message name="multiplyRequest">
<wsdl:part name="in0" type="xsd:int"/>
<wsdl:part name="in1" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="subtractResponse">
<wsdl:part name="subtractReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="divideRequest">
<wsdl:part name="in0" type="xsd:int"/>
<wsdl:part name="in1" type="xsd:int"/>
43
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part name="addReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="addRequest">
<wsdl:part name="in0" type="xsd:int"/>
<wsdl:part name="in1" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="subtractRequest">
<wsdl:part name="in0" type="xsd:int"/>
<wsdl:part name="in1" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="multiplyResponse">
<wsdl:part name="multiplyReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="divideResponse">
<wsdl:part name="divideReturn" type="xsd:float"/>
</wsdl:message>
<wsdl:portType name="MathPortType">
<wsdl:operation name="add" parameterOrder="in0 in1">
<wsdl:input message="impl:addRequest" name="addRequest"/>
<wsdl:output message="impl:addResponse" name="addResponse"/>
</wsdl:operation>
<wsdl:operation name="divide" parameterOrder="in0 in1">
<wsdl:input message="impl:divideRequest" name="divideRequest"/>
<wsdl:output message="impl:divideResponse" name="divideResponse"/>
</wsdl:operation>
<wsdl:operation name="multiply" parameterOrder="in0 in1">
<wsdl:input message="impl:multiplyRequest" name="multiplyRequest"/>
<wsdl:output message="impl:multiplyResponse"
44
name="multiplyResponse"/>
</wsdl:operation>
<wsdl:operation name="subtract" parameterOrder="in0 in1">
<wsdl:input message="impl:subtractRequest" name="subtractRequest"/>
<wsdl:output message="impl:subtractResponse"name="subtractResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MathServiceSoapBinding" type="impl:MathPortType">
<wsdlsoap:binding style="rpc"transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="add">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="addRequest">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:input>
<wsdl:output name="addResponse">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="divide">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="divideRequest">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:input>
<wsdl:output name="divideResponse">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
45
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multiply">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="multiplyRequest">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:input>
<wsdl:output name="multiplyResponse">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="subtractRequest">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:input>
<wsdl:output name="subtractResponse">
<wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://first.core.gt3tutorial/Math" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MathService">
<wsdl:port binding="impl:MathServiceSoapBinding" name="MathService">
<wsdlsoap:addresslocation="http://localhost/ogsa/services/core/first/MathService"/>
</wsdl:port>
46
<wsdl:port binding="gridservicesoapbinding:GridServiceSOAPBinding"name="GridServiceSOAPBindingPort"><wsdlsoap:addresslocation="http://localhost/ogsa/services/core/first/MathService"/></wsdl:port></wsdl:service>
</wsdl:definitions>
MathPortType.java
/** * MathPortType.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */
package gt3tutorial.core.first.Math;
public interface MathPortType extends java.rmi.Remote { public int add(int in0, int in1) throws java.rmi.RemoteException; public float divide(int in0, int in1) throws java.rmi.RemoteException; public int multiply(int in0, int in1) throws java.rmi.RemoteException; public int subtract(int in0, int in1) throws java.rmi.RemoteException;}
MathServiceGridLocator.java
/** * MathServiceGridLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */
package gt3tutorial.core.first.Math;
public class MathServiceGridLocator extendsorg.globus.ogsa.impl.core.service.ServiceLocator implementsorg.globus.ogsa.GridLocator { public gt3tutorial.core.first.Math.MathPortType getMathService
(org.gridforum.ogsi.HandleType handle) throws org.gridforum.ogsi.FaultType,org.globus.ogsa.GridServiceException { setStubClass
(gt3tutorial.core.first.Math.MathServiceSoapBindingStub.class); return (gt3tutorial.core.first.Math.MathPortType) getServicePort
(handle); } public gt3tutorial.core.first.Math.MathPortType getMathService
(org.gridforum.ogsi.LocatorType locator) throws org.gridforum.ogsi.FaultType,org.globus.ogsa.GridServiceException { setStubClass
(gt3tutorial.core.first.Math.MathServiceSoapBindingStub.class); return (gt3tutorial.core.first.Math.MathPortType) getServicePort
(locator);
47
} public gt3tutorial.core.first.Math.MathPortType getMathService
(java.net.URL url) throws org.globus.ogsa.GridServiceException { setStubClass
(gt3tutorial.core.first.Math.MathServiceSoapBindingStub.class); return (gt3tutorial.core.first.Math.MathPortType) getServicePort(url); } public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort
(org.gridforum.ogsi.HandleType handle) throws org.gridforum.ogsi.FaultType,org.globus.ogsa.GridServiceException { setStubClass
(org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub.class); return (org.gridforum.ogsi.GridService) getServicePort(handle); } public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort
(org.gridforum.ogsi.LocatorType locator) throws org.gridforum.ogsi.FaultType,org.globus.ogsa.GridServiceException { setStubClass
(org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub.class); return (org.gridforum.ogsi.GridService) getServicePort(locator); } public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort
(java.net.URL url) throws org.globus.ogsa.GridServiceException { setStubClass
(org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub.class); return (org.gridforum.ogsi.GridService) getServicePort(url); }
}
MathService.java
/** * MathService.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */
package gt3tutorial.core.first.Math;
public interface MathService extends javax.xml.rpc.Service { public java.lang.String getMathServiceAddress();
public gt3tutorial.core.first.Math.MathPortType getMathService() throwsjavax.xml.rpc.ServiceException;
public gt3tutorial.core.first.Math.MathPortType getMathService(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; public java.lang.String getGridServiceSOAPBindingPortAddress();
public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort()throws javax.xml.rpc.ServiceException;
public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort(java.net.URL portAddress) throws javax.xml.rpc.ServiceException;}
48
MathServiceLocator.java
/** * MathServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */
package gt3tutorial.core.first.Math;
public class MathServiceLocator extends org.apache.axis.client.Serviceimplements gt3tutorial.core.first.Math.MathService {
// Use to get a proxy class for MathService private final java.lang.String MathService_address =
"http://localhost/ogsa/services/core/first/MathService";
public java.lang.String getMathServiceAddress() { return MathService_address; }
// The WSDD service name defaults to the port name. private java.lang.String MathServiceWSDDServiceName = "MathService";
public java.lang.String getMathServiceWSDDServiceName() { return MathServiceWSDDServiceName; }
public void setMathServiceWSDDServiceName(java.lang.String name) { MathServiceWSDDServiceName = name; }
public gt3tutorial.core.first.Math.MathPortType getMathService() throwsjavax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(MathService_address); } catch (java.net.MalformedURLException e) { throw new javax.xml.rpc.ServiceException(e); } return getMathService(endpoint); }
public gt3tutorial.core.first.Math.MathPortType getMathService(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { gt3tutorial.core.first.Math.MathServiceSoapBindingStub _stub = new
gt3tutorial.core.first.Math.MathServiceSoapBindingStub(portAddress, this); _stub.setPortName(getMathServiceWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } }
49
// Use to get a proxy class for GridServiceSOAPBindingPort private final java.lang.String GridServiceSOAPBindingPort_address =
"http://localhost/ogsa/services/core/first/MathService";
public java.lang.String getGridServiceSOAPBindingPortAddress() { return GridServiceSOAPBindingPort_address; }
// The WSDD service name defaults to the port name. private java.lang.String GridServiceSOAPBindingPortWSDDServiceName =
"GridServiceSOAPBindingPort";
public java.lang.String getGridServiceSOAPBindingPortWSDDServiceName() { return GridServiceSOAPBindingPortWSDDServiceName; }
public void setGridServiceSOAPBindingPortWSDDServiceName(java.lang.Stringname) { GridServiceSOAPBindingPortWSDDServiceName = name; }
public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort()throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(GridServiceSOAPBindingPort_address); } catch (java.net.MalformedURLException e) { throw new javax.xml.rpc.ServiceException(e); } return getGridServiceSOAPBindingPort(endpoint); }
public org.gridforum.ogsi.GridService getGridServiceSOAPBindingPort(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub _stub = new
org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub(portAddress, this); _stub.setPortName(getGridServiceSOAPBindingPortWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } }
/** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws
javax.xml.rpc.ServiceException { try { if
(gt3tutorial.core.first.Math.MathPortType.class.isAssignableFrom(serviceEndpointInterface)) { gt3tutorial.core.first.Math.MathServiceSoapBindingStub _stub =
50
new gt3tutorial.core.first.Math.MathServiceSoapBindingStub(new java.net.URL(MathService_address), this); _stub.setPortName(getMathServiceWSDDServiceName()); return _stub; } if (org.gridforum.ogsi.GridService.class.isAssignableFrom
(serviceEndpointInterface)) { org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub _stub =
new org.gridforum.ogsi.bindings.GridServiceSOAPBindingStub(new java.net.URL(GridServiceSOAPBindingPort_address), this); _stub.setPortName(getGridServiceSOAPBindingPortWSDDServiceName
()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub
implementation for the interface: " + (serviceEndpointInterface == null ?"null" : serviceEndpointInterface.getName())); }
/** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class
serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } String inputPortName = portName.getLocalPart(); if ("MathService".equals(inputPortName)) { return getMathService(); } else if ("GridServiceSOAPBindingPort".equals(inputPortName)) { return getGridServiceSOAPBindingPort(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; } }
public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName
("http://first.core.gt3tutorial/Math", "MathService"); }
private java.util.HashSet ports = null;
public java.util.Iterator getPorts() { if (ports == null) { ports = new java.util.HashSet(); ports.add(new javax.xml.namespace.QName("MathService")); ports.add(new javax.xml.namespace.QName
51
("GridServiceSOAPBindingPort")); } return ports.iterator(); }
}
MathServiceSoapBindingStub.java
/** * MathServiceSoapBindingStub.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */
package gt3tutorial.core.first.Math;
public class MathServiceSoapBindingStub extends org.apache.axis.client.Stubimplements gt3tutorial.core.first.Math.MathPortType { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector();
static org.apache.axis.description.OperationDesc [] _operations;
static { _operations = new org.apache.axis.description.OperationDesc[4]; org.apache.axis.description.OperationDesc oper; oper = new org.apache.axis.description.OperationDesc(); oper.setName("add"); oper.addParameter(new javax.xml.namespace.QName("", "in0"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.addParameter(new javax.xml.namespace.QName("", "in1"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.setReturnType(new javax.xml.namespace.QName
("http://www.w3.org/2001/XMLSchema", "int")); oper.setReturnClass(int.class); oper.setReturnQName(new javax.xml.namespace.QName("", "addReturn")); oper.setStyle(org.apache.axis.enum.Style.RPC); oper.setUse(org.apache.axis.enum.Use.ENCODED); _operations[0] = oper;
oper = new org.apache.axis.description.OperationDesc(); oper.setName("divide"); oper.addParameter(new javax.xml.namespace.QName("", "in0"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.addParameter(new javax.xml.namespace.QName("", "in1"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.setReturnType(new javax.xml.namespace.QName
("http://www.w3.org/2001/XMLSchema", "float")); oper.setReturnClass(float.class);
52
oper.setReturnQName(new javax.xml.namespace.QName("","divideReturn")); oper.setStyle(org.apache.axis.enum.Style.RPC); oper.setUse(org.apache.axis.enum.Use.ENCODED); _operations[1] = oper;
oper = new org.apache.axis.description.OperationDesc(); oper.setName("multiply"); oper.addParameter(new javax.xml.namespace.QName("", "in0"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.addParameter(new javax.xml.namespace.QName("", "in1"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.setReturnType(new javax.xml.namespace.QName
("http://www.w3.org/2001/XMLSchema", "int")); oper.setReturnClass(int.class); oper.setReturnQName(new javax.xml.namespace.QName("",
"multiplyReturn")); oper.setStyle(org.apache.axis.enum.Style.RPC); oper.setUse(org.apache.axis.enum.Use.ENCODED); _operations[2] = oper;
oper = new org.apache.axis.description.OperationDesc(); oper.setName("subtract"); oper.addParameter(new javax.xml.namespace.QName("", "in0"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.addParameter(new javax.xml.namespace.QName("", "in1"), new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"),int.class, org.apache.axis.description.ParameterDesc.IN, false, false); oper.setReturnType(new javax.xml.namespace.QName
("http://www.w3.org/2001/XMLSchema", "int")); oper.setReturnClass(int.class); oper.setReturnQName(new javax.xml.namespace.QName("",
"subtractReturn")); oper.setStyle(org.apache.axis.enum.Style.RPC); oper.setUse(org.apache.axis.enum.Use.ENCODED); _operations[3] = oper;
}
public MathServiceSoapBindingStub() throws org.apache.axis.AxisFault { this(null); }
public MathServiceSoapBindingStub(java.net.URL endpointURL,javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); super.cachedEndpoint = endpointURL; }
public MathServiceSoapBindingStub(javax.xml.rpc.Service service) throwsorg.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; }
53
}
private org.apache.axis.client.Call createCall() throwsjava.rmi.RemoteException { try { org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); } return _call; } catch (java.lang.Throwable t) { throw new org.apache.axis.AxisFault("Failure trying to get the
Call object", t); } }
public int add(int in0, int in1) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[0]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setSOAPVersion
(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName
("http://first.core.gt3tutorial/Math", "add"));
setRequestHeaders(_call); setAttachments(_call); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new
java.lang.Integer(in0), new java.lang.Integer(in1)});
if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; }
54
else { extractAttachments(_call); try { return ((java.lang.Integer) _resp).intValue(); } catch (java.lang.Exception _exception) { return ((java.lang.Integer)
org.apache.axis.utils.JavaUtils.convert(_resp, int.class)).intValue(); } } }
public float divide(int in0, int in1) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[1]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setSOAPVersion
(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName
("http://first.core.gt3tutorial/Math", "divide"));
setRequestHeaders(_call); setAttachments(_call); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new
java.lang.Integer(in0), new java.lang.Integer(in1)});
if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return ((java.lang.Float) _resp).floatValue(); } catch (java.lang.Exception _exception) { return ((java.lang.Float)
org.apache.axis.utils.JavaUtils.convert(_resp, float.class)).floatValue(); } } }
public int multiply(int in0, int in1) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[2]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setSOAPVersion
(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName
("http://first.core.gt3tutorial/Math", "multiply"));
setRequestHeaders(_call); setAttachments(_call); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new
55
java.lang.Integer(in0), new java.lang.Integer(in1)});
if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return ((java.lang.Integer) _resp).intValue(); } catch (java.lang.Exception _exception) { return ((java.lang.Integer)
org.apache.axis.utils.JavaUtils.convert(_resp, int.class)).intValue(); } } }
public int subtract(int in0, int in1) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[3]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setSOAPVersion
(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName
("http://first.core.gt3tutorial/Math", "subtract"));
setRequestHeaders(_call); setAttachments(_call); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new
java.lang.Integer(in0), new java.lang.Integer(in1)});
if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return ((java.lang.Integer) _resp).intValue(); } catch (java.lang.Exception _exception) { return ((java.lang.Integer)
org.apache.axis.utils.JavaUtils.convert(_resp, int.class)).intValue(); } } }
}
MathImpl.java
package gt3tutorial.core.factory.impl;
import org.globus.ogsa.impl.ogsi.GridServiceImpl;import gt3tutorial.core.factory.Math.MathPortType;import java.rmi.RemoteException;
56
public class MathImpl extends GridServiceImpl implements MathPortType{ private int value = 0;
public MathImpl() { super("Grid Service Exemplo para Operações Aritméticas"); }
public void add(int a) throws RemoteException { value = value + a; } public void subtract(int a) throws RemoteException { value = value - a; } public int getValue() throws RemoteException { return value; }}
Math.wsdd
<?xml version="1.0"?><deployment name="defaultServerConfig"
xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="tutorial/core/factory/MathFactoryService"provider="Handler" style="wrapped"> <parameter name="name" value="MathService Factory"/> <parameter name="instance-name" value="MathService Instance"/> <parameter name="instance-schemaPath" value="schema/gt3tutorial.core.factory/Math/MathService.wsdl"/> <parameter name="instance-baseClassName" value="gt3tutorial.core.factory.impl.MathImpl"/>
<!-- Start common parameters --> <parameter name="allowedMethods" value="*"/> <parameter name="persistent" value="true"/> <parameter name="className" value="org.gridforum.ogsi.Factory"/> <parameter name="baseClassName" value="org.globus.ogsa.impl.ogsi.PersistentGridServiceImpl"/> <parameter name="schemaPath" value="schema/ogsi/ogsi_factory_service.wsdl"/> <parameter name="handlerClass" value="org.globus.ogsa.handlers.RPCURIProvider"/> <parameter name="factoryCallback" value="org.globus.ogsa.impl.ogsi.DynamicFactoryCallbackImpl"/>
57
<parameter name="operationProviders" value="org.globus.ogsa.impl.ogsi.FactoryProvider"/> </service></deployment>
Build.xml
<?xml version="1.0"?>
<project default="all" basedir=".">
<!-- Este arquivo foi elaborado por Borja Sotomayor informações incluídas nas Referências Bibliográficas -->
<property file="build.properties"/> <property file="${user.home}/build.properties"/>
<path id="classpath"> <pathelement location="${java.home}/../lib/tools.jar"/>
<pathelement location="./"/> <pathelement location="${build.dest}"/> <fileset dir="lib"> <include name="*.jar"/> </fileset> <fileset dir="${ogsa.root}/lib"> <include name="*.jar"/> </fileset> <pathelement path="${java.class.path}"/> </path>
<property name="src.dir" value="./"/> <property name="build.dir" value="./build"/> <property name="build.lib" value="${build.dir}/lib"/> <property name="build.stubs" value="${build.dir}/stubs"/> <property name="build.dest" value="${build.dir}/classes"/> <property name="build.schema" value="${build.dir}/schema"/> <property name="build.services" value="${ogsa.root}/build-services.xml"/> <property name="build.packages" value="${ogsa.root}/build-packages.xml"/> <property name="schema.origin" value="${ogsa.root}/schema"/> <property name="stubs.dest" value="../stubs"/><!-- <property name="sde.schema.file" value="${package.dir}/schema/$
{interface}DataType.xsd"/>--> <property file="${ogsa.root}/ogsa.properties"/> <property name="mapping.file" value="namespace2package.mappings"/>
<target name="copyFiles"> <mkdir dir="${build.dest}"/> <mkdir dir="${build.lib}"/> <mkdir dir="${build.schema}"/> <mkdir dir="${build.stubs}"/> <mkdir dir="${lib.dir}"/> <!--<available file="${sde.schema.file}"
property="sde.schema.file.present"/> <available property="stubs.present" type="dir" file="${stubs.dest}" />-->
58
<copy toDir="${build.schema}"> <fileset dir="${schema.origin}"/> </copy> <available file="${mapping.file}" property="mapping.file.present"/> </target>
<target name="mergeMapping" if="mapping.file.present"> <ant antfile="${build.services}" target="mergePackageMapping" /> </target>
<target name="setenv" depends="copyFiles,mergeMapping" />
<target name="generateWSDLfromJava" if="java.interface" depends="setenv"> <property name="schema.file" value="${interface.name}Service.wsdl"/> <ant antfile="${build.services}" target="generateWSDL"> <property name="interface" value="${package.dir}/impl/${interface.name}.
java"/> <property name="interface.package" value="${package}.impl"/> <!--<property name="interface.name" value="${interface}"/>--> <property name="interface.dir" value="${package.dir}/impl"/> <property name="generated.dir" value="${package}"/> </ant> </target>
<target name="generateWSDLfromGWSDL" if="gwsdl.interface" depends="setenv"> <property name="schema.file" value="${interface.name}_service.wsdl"/>
<copy todir="${build.schema}/${package}/${interface.name}"overwrite="true"> <fileset dir="${package.dir}/schema"/> </copy>
<ant antfile="${build.services}" target="GWSDL2WSDL"> <property name="build.schema.dir" value="${package}/${interface.name}"/> <property name="wsdl.root" value="${interface.name}"/> </ant>
<ant antfile="${build.services}" target="generateBinding"> <property name="binding.root" value="${interface.name}"/> <property name="build.schema.dir" value="${package}/${interface.name}"/> <property name="porttype.wsdl" value="${interface.name}.wsdl"/> </ant> </target>
<!-- <target name="decorateSDD" if="sde.schema.file.present"> <copy file="${sde.schema.file}" toDir="${build.schema}/${package}/
${interface.name}"/> <ant antfile="${build.services}" target="decorateSDD"> <property name="sdd.file" value="${interface}DataType.xsd"/> <property name="wsdl.dir" value="${package}/${interface}"/> <property name="wsdl.file" value="${interface}Service.wsdl"/> <property name="import.sdd" value="import"/> </ant> </target>
-->
<target name="stubs" unless="stubs.present" depends="setenv,generateWSDLfromJava, generateWSDLfromGWSDL"> <ant antfile="${build.services}" target="generateStubs">
59
<property name="schema.file.dir" value="${package}/${interface.name}"/> <property name="schema.file" value="${schema.file}"/> </ant> </target>
<target name="compileStubs" depends="stubs"> <javac srcdir="${build.stubs}" destdir="${build.dest}" debug="${debug}" deprecation="${deprecation}" classpathref="classpath"> </javac> </target>
<target name="compile" depends="compileStubs"> <javac srcdir="${package.dir}/impl" destdir="${build.dest}"
debug="${debug}" deprecation="${deprecation}" classpathref="classpath"> </javac> </target>
<target name="stubjar" depends="compile"> <jar jarfile="${build.lib}/${package}.${interface.name}-stub.jar"
basedir="${build.dest}" > <include name="**/${package.dir}/**" /> <exclude name="**/${package.dir}/impl/**" /> <exclude name="**/${package.dir}/client/**" /> <exclude name="**/${package.dir}/schema/**" /> </jar> </target>
<target name="jar" depends="stubjar"> <jar jarfile="${build.lib}/${package}.${interface.name}.jar"
basedir="${build.dest}" > <include name="**/${package.dir}/impl/**" /> <exclude name="**/${package.dir}/impl/${interface.name}.class" /> </jar> </target>
<target name="gar" depends="jar"> <copy todir="${build.lib}"> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </copy> <ant antfile="${build.packages}" target="makeGar"> <property name="gar.name" value="${build.lib}/${package}.${interface.
name}.gar"/> <property name="garlib.dir" value="${build.lib}"/> <property name="garserverdeployment.file" value="${package.dir}/
${interface.name}.wsdd"/> <property name="garschema.origin" value="${build.schema}/${package}"/> <property name="garschema.path" value="${package}"/> </ant> </target>
<target name="compileClient" depends="setenv"> <javac srcdir="${src.dir}" destdir="${build.dest}" debug="${debug}" deprecation="${deprecation}" classpathref="classpath">
60
</javac> </target>
<target name="clean"> <delete dir="${build.dir}"/> </target>
<target name="all" depends="gar"/>
</project>
MathClient.java
package gt3tutorial.core.factory.client;
import gt3tutorial.core.factory.Math.MathServiceGridLocator;import gt3tutorial.core.factory.Math.MathPortType;import java.net.URL;
public class MathClient{ public static void main(String[] args) { try { URL GSH = new java.net.URL(args[0]); int a = Integer.parseInt(args[1]);
MathServiceGridLocator mathServiceLocator = newMathServiceGridLocator(); MathPortType math = mathServiceLocator.getMathService(GSH);
math.add(a); System.out.println("Somado o valor: " + a);
int value = math.getValue();
System.out.println("Valor atual: " + value);
}catch(Exception e) { System.out.println("ERRO!"); e.printStackTrace(); } }}
MathClient2.java
package gt3tutorial.core.factory.client;
import org.gridforum.ogsi.OGSIServiceGridLocator;import org.gridforum.ogsi.GridService;import org.gridforum.ogsi.Factory;
61
import org.gridforum.ogsi.LocatorType;import org.globus.ogsa.utils.GridServiceFactory;
import gt3tutorial.core.factory.Math.MathServiceGridLocator;import gt3tutorial.core.factory.Math.MathPortType;
import java.net.URL;
public class MathClient2{ public static void main(String[] args) { try { URL GSH = new java.net.URL(args[0]); int a = Integer.parseInt(args[1]);
OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator(); Factory factory = gridLocator.getFactoryPort(GSH); GridServiceFactory mathFactory = new GridServiceFactory(factory);
LocatorType locator = mathFactory.createService(); MathServiceGridLocator mathLocator = new MathServiceGridLocator(); MathPortType math = mathLocator.getMathService(locator);
math.add(a); System.out.println("Valor somado: " + a);
int value = math.getValue(); System.out.println("Valor atual: " + value); GridService gridService = gridLocator.getGridServicePort(locator); gridService.destroy(); }catch(Exception e) { System.out.println("ERRO!"); e.printStackTrace(); } }}
Artigo sobre o projeto
A partir da página seguinte é apresentado um artigo escrito sobre o mesmo tema do projeto
62