Neste post irei descrever como podemos usar o componente Service Callout do OSB.
Irei lhe mostrar como é facil montar o REQUEST e RESPONSE do nosso serviço e demonstrar como podemos usar nosso RESPONSE para várias chamadas de serviços ou usando vários componentes Service Callout
Em um post anterior mostrei como podemos expor um serviço do BPEL no OSB, para isso clique aqui e veja o post, nosso objetivo agora será o mesmo, no caso expor um serviço mas agora usaremos o componente Service Callout, então vamos começar !!!
Crie então um Proxy Service chamado ServiceCalloutProxy
Selecione então na aba General o nosso WSDL, conforme abaixo:
Clique então na aba Message Flow e arraste o componente Pipeline Pair para que fique conforme abaixo:
Agora abaixo do Request Pipeline arraste o componente Stage
Dentro do stage1 arraste o componente Service Callout
Dê um clique sobre o seu Service Callout e abaixo em Properties clique em Browse e procure o serviço SelectDbAdapterBPELBusiness.biz
Cliquem em OK após escolher o serviço SelectDbAdapterBPELBusiness.biz
- Em Invoking escolha a opção process
- Em Request Variable coloque SelectRequest
- Em Response Variable coloque SelectResponse
Abaixo de Request Action arraste o componente Assign e novamente em Properties (Properties deste Assign) coloque nossa variável selectRequest em Variable
Clique então em Expression acima do selectRequest para então colocarmos nosso payload de Request do nosso Serviço a ser chamado, no caso do SelectDbAdapterBPELBusiness.biz
Para isso é muito simples, basta apenas você se logar no seu sbconsole e chamar o Business SelectDbAdapterBPELBusiness
Clique então no ícone que parece uma “baratinha” conforme acima para então copiar o payload
Copiado o payload acima basta agora apenas colar dentro do nosso Assign conforme abaixo:
Porem, veja que entre a tag <idCliente> está o valor 100 que é o pre-fixado pelo próprio OSB, e precisamos que este valor seja o passado por nós, então basta apenas expandir no body que estará ao lado direito na guia Variable Structures e arrastar para o lado esquerdo, veja abaixo:
Agora substitua o valor 100 por este body, acrescentando chaves e também a xquery data para que possamos pegar o valor que será passado em idCliente, veja abaixo como ficou.
Clique em OK e teremos o seguinte:
Ótimo, agora acrescente um Stage para o Response Pipeline e dentro deste Stage arraste o componente Replace conforme abaixo:
Clique sobre o Replace e na guia abaixo em Properties coloque conforme abaixo:
- XPath: . (ponto)
- In Variable: body
- Replace node contents: (Marcar esta opção)
Clique agora em <Expression>
Ao lado direito em Variable Stuctures clique em $body – obterDadosClienteResponse e depois em nomeCliente e arraste para o lado esquerdo conforme abaixo:
Agora vamos montar o nosso payload que será o nosso Response do Serviço
Exclua a variable $body e veja abaixo como ficará as tags:
Veja passo a passo como é simples:
Estava assim:
- $body/ser:obterDadosClienteResponse/nomeCliente
Excluí a variable e a barra: $body/
- ser:obterDadosClienteResponse/nomeCliente
Coloquei o ser:obterDadosClienteResponse entre tags, lembrando que estou abrindo e fechando as tags
- <obterDadosClienteResponse> </obterDadosClienteResponse>
Coloquei o nomeCliente entre a tag <obterDadosClienteResponse>
- <ser:obterDadosClienteResponse>
<nomeCliente> </nomeCliente>
</ser:obterDadosClienteResponse>
Agora preencha as demais tags faltantes que são profissaoCliente, salarioCliente e numeroDeptCliente e ficará conforme abaixo:
Clique em OK para fechar esta caixa acima para que eu lhe explique de onde virão as informações para nosso payload, veja acima que apenas montamos a estrutura do nosso response, precisamos agora preencher com as informações que virão do nosso business SelectDbAdapterBPELBusiness
Lembra do Service Callout que nele preenchemos nossa variable de Request e Response ? no caso, selectRequest e selectResponse
Pois bem, a resposta do nosso business SelectDbAdapterBPELBusiness será toda gravada na nossa variable selectResponse
OK, aqui só queria explicar de onde virá a resposta do nosso payload.
Volte em nosso Replace e clique novamente ao lado de Expression:
Agora preencha nosso payload para que fique conforme abaixo:
Veja acima que o OSB grifou alguns nomes, isso porque ele não reconheceu a namespace sel:
Para que você entenda a namespace sel: será a mesma do nosso payload de request que pegamos acima, lembra ?
Veja acima que no payload a namespace sel: é http://xmlns.oracle.com/UansBlogApplication/SelecDBAdapter/SelecDBAdapterBPELProcess sem as aspas duplas:
Então volte em nosso replace e clique na guia Namespace Definition e clique em Add
Na caixa que irá abrir em Prefix: coloque sel e em URI coloque http://xmlns.oracle.com/UansBlogApplication/SelecDBAdapter/SelecDBAdapterBPELProcess
Clique em OK e veja que não teremos mais problemas:
Agora para que você entenda, como eu disse na nossa variable $selectResponse virá a resposta do nosso business ou nosso serviço que chamamos, veja um exemplo da minha chamada do business SelectDbAdapterBPELBusiness
Veja também o porque estamos fazendo o Replace da nossa Variable Body pois o nosso processResponse está dentro do Body
E após nossa variable $selectResponse o serviço nos trará o <Nome>, <Profissao> e assim por diante, por isso no nosso replace eu preencho $selectResponse/sel:Nome e etc..
Porem veja que estou usando a namespace sel: e acima no nosso serviço ele não trás com este prefixo sel: … Este é um detalhe do meu WSDL do atributo elementFormDefault e attributeFormDefault mas que explicarei em um Post posterior, por enquanto quero que você apenas se atente a este detalhe pois caso você esteja chamando um serviço diferente veja se você tem que passar o prefixo da sua namespace ou não, faça um teste com ambos para ver se há resultado.
Agora que você entendeu tudo como funciona e o porque de algumas coisas em seu Response, Publique suas alterações para fazermos nossos testes:
Vá no seu SbConsole e chame agora nosso serviço ServiceCalloutProxy
Aqui vou passar o <idCliente> 7 que é o meu ID
Clique em Execute e veja abaixo a resposta do nosso serviço:
Aqui é interessante você entender que a variável que usamos no Response poderá ser usada sempre que quisermos montar uma resposta para nosso serviço, independente de quantos serviços ou Service Callout nós usemos, sempre haverá uma variavel de Response.
Duvidas ? Deixe seu comentário
Abraços e até a Próxima
/:-D
Caio André Mondoni said:
Olá Uans !
poderia me tirar uma dúvida, estou com a seguinte dificuldade:
eu tenho seguinte payload(apenas um exemplo)
123
432
543
454
é possível eu enviar pelo service callout cada individualmente, enviando apenas um payload com esses dois ? gostaria que meu BPEL recebe-se cada individualmente para fazer tratamento
Grato !!
Atenciosamente,
Caio André Mondoni
Uans said:
Olá Caio,
Primeiramente obrigado pelo acesso ao blog e espero sempre poder ajudar da melhor forma possível.
É possivel sim, você só precisa especificar no seu WSDL do Proxy que você esta enviando uma lista, no caso seria mais ou menos assim:
#listaRequestMessage#
#message#
#teste1#123#/teste1#
#teste2#323#/teste2#
#/message#
#message#
#teste1#123#teste1#
#teste2#323#teste2#
#/message#
#/listaRequestMessage#
No caso é uma lista contendo “N” #Message#, depois disso você fará um FOR para iterar nesta lista e fazer o que você precisa.
Espero ter ajudado.
Duvidas estou a disposição.
Rafael Reuber said:
Qual a diferença entre Route Message e Service Callout?
Uans said:
Olá Rafael,
Primeiramente, obrigado pelo acesso ao Blog e espero sempre poder ajudar de alguma forma.
A diferença é que usando o Service Callout você define uma variavel de entrada que será sua request e uma variavel de saida que será seu response, neste caso conseguimos manipular o seu response usando esta variável para por exemplo deixar retornar do serviço que vocẽ está fazendo o service Callout só o elemento que queremos, já no Route Message vocẽ não define esta variavel de entrada e de saída, usamos esta opção quando não será necessário alterar sua entrada ou sua saída e o seu WSDL do serviço que vocẽ está chamando é o mesmo WSDL do serviço que vocẽ está fazendo o Route Message.
Espero que tenha compreendido, caso não, pode falar que tento exemplificar de outra forma.
Abraços
Uans