BPEL

Usando o ForEach do BPEL

Algo muito usado em linguagens de programação é sem duvidas um FOR para iteração em uma lista de elementos qualquer, neste Post pretendo ajudar você a usar o componente For Each do BPEL realizando um simples laço, iterando e concatenando nomes que colocaremos como parâmetro para nosso Loop.

Para nossos testes, vamos criar um projeto chamado ForEachBpel

Clique em File >> New

Imagem Blog UansCarvalho

Será aberto uma tela como abaixo:

Em seguida selecione Generic Project

Imagem Blog UansCarvalho

Em Project Name coloque ForEachBpel e em Project Technologies selecione o nome SOA e clique na setinha > para que o nome vá para a direita e fique como abaixo:

Obs: Veja em Directory que ele irá preencher automaticamente o nome onde será criado o nome do projeto que você informou em Project Name

No meu caso: /home/uans/jdeveloper/mywork/UansBlogApplication/ForEachBpel

Clique em Next e Finish em seguida, deixando o Composite Template em Empty Composite

Imagem Blog UansCarvalho

Agora que criamos um Projeto vazio vamos criar um BPEL

Imagem Blog UansCarvalho

Agora com o botão direito clique Componets > Insert > BPEL Process

Clique em BPEL 2.0 Specification

Em name coloque ForEachBpel

Em Template selecione Synchronous BPEL Process e clique em OK

Deixe selecionado a opção Expose as a SOAP service, pois este será o responsável por criar um WSDL e XSD default o qual iremos alterar para nossos testes.

Imagem Blog UansCarvalho

Pronto, ele deverá ficar assim:

Imagem Blog UansCarvalho

Abra agora o arquivo ForEachBPELProcess.xsd que foi criado automaticamente.

Imagem Blog UansCarvalho

No complexType do element name=”process” estará conforme abaixo:

<element name=”process”>
        <complexType>
             <sequence>
                   <element name=”input” type=”string”/>
             </sequence>
        </complexType>
</element>

Então altere para: (apenas o destacado em vermelho)

<element name=”process”>
<complexType>
<sequence>
<element name=”nome” type=”string” maxOccurs=”unbounded” minOccurs=”1″/>
</sequence>
</complexType>
</element>

Então deverá ficar assim:

Imagem Blog UansCarvalho

Vamos entender o que foi alterado:

  • Em element name=”nome” alterei nossa variável de entrada para nome
  • Em maxOccurs=”unbounded” estou dizendo que poderemos ter inúmeras vezes o parâmetro nome mencionado
  • Em minOccurs=”1″ estou dizendo que esse parâmetro é obrigatório

Abra agora o seu composite BPEL e dentro do ForEachBPELProcess.bpel arraste e solte o componente For Each conforme abaixo:

Imagem Blog UansCarvalho

Dê um duplo clique sobre o seu ForEach1 e na guia General coloque conforme abaixo:

  • Name: ForEachNome
  • Counter Name: ForEachContador

Imagem Blog UansCarvalho

Agora na guia Counter Values, em Start Value coloque 1 no campo Expression e em Final Value clique sobre o ícone que parece uma pequena calculadora conforme abaixo:

Imagem Blog UansCarvalho

Na caixa que se abrirá em Advanced Functions escolha a opção BPEL XPath Extension Functions

Imagem Blog UansCarvalho

Dê um duplo clique sobre a opção ora:countNodes()

Imagem Blog UansCarvalho

Dentro do parêntese de ora:countNodes() coloque duas aspas simples e dentro das aspas simples aperte Control do seu teclado e ao mesmo tempo a barra de espaço, veja que aparecerão as opções abaixo:

  • inputVariable
  • outputVariable
  • ForEachCont…

Selecione a opção inputVariable, coloque uma virgula após o nome, e coloque novamente duas aspas simples e dentro das aspas selecione a opção payload que irá aparecer, novamente coloque uma virgula e acrescente mais duas aspas simples e dentro das aspas selecione a opção client:nome que irá aparecer, então ficará conforme abaixo:

ora:countNodes(‘inputVariable’,’payload’,’client:nome’)

Imagem Blog UansCarvalho

Clique em OK e ficará assim:

Imagem Blog UansCarvalho

Clique em OK novamente e arraste um componente Assign acima de nosso ForEach e renomeie o nome Assign1 dando um duplo clique sobre o nome e coloque a palavra Olá pressionando Enter em seguida, conforme abaixo:

Imagem Blog UansCarvalho

Dentro de nosso Olá que é nossa caixinha de variável, expanda a opção outputVariable >> payload >> client:processResponse >> client:result e para dentro dela arraste o ícone acima que parece uma pequena calculadora

Imagem Blog UansCarvalho

Dentro da caixa que será aberta acrescente o nome Olá: seguido de um espaço entre aspas simples conforme abaixo e clique em OK

Imagem Blog UansCarvalho

Agora para dentro de nosso ForEachNome arraste outro Assign e o renomeie para o nome Concatena

Imagem Blog UansCarvalho

Abra a nossa caixinha Concatena novamente arraste o ícone que parece uma pequena calculadora ou simplesmente clique com o botão direito sobre o nome client:result (outputVariable >> payload >> client:processResponse >> client:result) e clique em Expression

Imagem Blog UansCarvalho

Em Advanced Functions escolha a opção String Functions

Imagem Blog UansCarvalho

Dê um duplo clique sobre o nome concat e dentro dos parenteses de concat() de um duplo clique em client:result do seu outputVariable (outputVariable >> payload >> client:processResponse >> client:result)

Imagem Blog UansCarvalho

Acrescente uma virgula após o result e uma aspas simples, dê um espaço e acrescente novamente mais uma aspas simples seguida de uma virgula e dê agora um duplo clique em client:nome agora do seu inputVariable (inputVariable >> payload >> client:process >> client:nome)

Imagem Blog UansCarvalho

Ao lado de nome acrescente [] e dentro dos colchetes acrescente o nome do nosso For Each ($ForEachContador, aqui preste atenção que foi acrescentado o cifrão ($) identificando que é uma variável), dando um duplo clique sobre ele e ao lado do colchetes que foi fechado acrescente uma virgula, uma aspas simples, novamente uma virgula e novamente uma aspas simples conforme abaixo:

concat($outputVariable.payload/client:result,’ ‘,$inputVariable.payload/client:nome[$ForEachContador],’,’)

Imagem Blog UansCarvalho

Clique em OK

Imagem Blog UansCarvalho

Clique em OK novamente na tela acima

Agora arraste um outro Assign abaixo do seu ForEachNome e renomeie para TudoBem

Imagem Blog UansCarvalho

Dentro da sua caixa TudoBem em client:result acrescente a expression abaixo:

concat($outputVariable.payload/client:result,’ tudo bem ?’)

Imagem Blog UansCarvalho

Clique em OK

Imagem Blog UansCarvalho

Clique em OK novamente na tela acima

Realize o deploy localmente do nosso projeto e vamos testa-lo

 

No seu Browser vá no endereço http://localhost:10000/em

Obs: A porta 10000 é o numero que escolhi ao criar o meu Domínio.

Faça o Login:

Imagem Blog UansCarvalho

Clique no seu projeto: ForEachBpel[1.0]

Imagem Blog UansCarvalho

Clique em Test

Imagem Blog UansCarvalho

Abaixo em input coloque 3 onde aparece o 0, pois será o tamanho de nosso array, em seguida clique no ícone ao lado

Imagem Blog UansCarvalho

Feito isso será aberta a tela abaixo para inserirmos 3 nomes, então preencha-os e clique em Test Web Service

Imagem Blog UansCarvalho

Na guia Response, veja o resultado

Imagem Blog UansCarvalho

 

Duvidas ? Deixe seu comentário e faça download deste Projeto :-)

 

Abraços e até a Próxima

/:-D

 

 

Criei este Blog destinado a desenvolvedores e interessados na Tecnologia Oracle SOA Suite, minha idéia é que no futuro ele sirva de referência para Analistas e Desenvolvedores desde aprendizes a especialistas. Já existem alguns Posts interessantes que abordam um pouco do meu dia a dia, no passar do tempo irei alimentar este Blog com o máximo de informações possíveis, por isso peço por gentileza aos interessados e afins que caso tenham alguma dúvida, sugestão ou crítica que me digam para que eu possa da melhor forma suprir as expectativas e na medida do possível sanar todas as duvidas que vierem a surgir ou até mesmo criar novos Posts abordando algum tópico que venha a ser relevante para todos os interessados. Obrigado Uans Carvalho

3 Comments

  • Altieres Jesus

    Boa tarde,

    Muito bom este seu post.

    Eu tenho uma situação e gostaria de saber se você pode me ajudar a resolver, estou realizando um loop parecido com este seu, a diferença é que para cada item estou realizando um invoke de outro bpel, e o que ocorre é que é sempre enviado o ultimo item da lista em todas as chamadas.

    Sabe me dizer se já passou por um problema como este?

    Obrigado.

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *