Phoenix Criminal Lawyer

BPEL Utilizando For Each e DbAdapter

Em algumas situações no desenvolvimento de serviços utilizando BPEL, me deparei com a necessidade de repetir os dados, seja este qual for o motivo. Neste post vou utilizar um iterador para efetuar um insert multiplo na base de dados utilizando DBAdapter. Para saber mais sobre o DBAdapter acesse: http://brunogualda.com.br/blog/utilizando-bpel-com-dbadapter/.

Para isso, temos que primeiramente criar um projeto BPEL. Se este for seu primeiro contato, é de grande valia acessar este post http://brunogualda.com.br/blog/introducao-ao-bpel/, nele há uma introdução de como criar um projeto BPEL.

Partindo do princípio que já possui conhecimentos básicos para este post, clique em File > New > SOA Application e clique em OK. Dê um nome para a aplicação que está sendo criada, no meu caso BPELWithFORAndBDAdapter e clique em next, na tela seguinte insira um nome para o projeto, irei seguir o padrão do nome dado a aplicação, clique em next e na tela seguinte escolha o template do composite que deseja adicionar. Neste exemplo estou utilizando o “Composite With BPEL Process“, assim, o BPEL já é adicionado automaticamente quando clicar em finish.

Em seguida um tela para a definição do BPEL será aberta, defina a especificação 2.0, dê um nome para o BPEL, defina o template como Synchronous e clique em OK. Uma tela com o composite será aberta com o BPEL que acabou de criar, clique com o botão direito sobre ele e clique em editar. Pronto, neste momento sua tela deverá estar conforme apresentada abaixo:

Para efetuarmos a iteração de insert, vamos utilizar o componente  For Each , que pode ser encontrado em BPEL Constructs > Structured Activies. Arraste o componete entre os elementos receiveInput e replyOutput. Neste ponto o BPEL deverá estar como apresentado abaixo:

Antes de continuarmos com as definições no BPEL, precisamos efetuar a definição dos dados das variáveis no XSD criado pelo BPEL. Abra o arquivo xsd, na parte inferior clique em source. A primeira coisa a fazer é declarar um namespace para nosso xsd, para isso, na frente do namespace padrão xmlns=”http://www.w3.org/2001/XMLSchema” adicione nosso namespace xmlns:xs=”http://bpelwithforanddbadapter.bpel.gualda.com.br/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter”. Assim, todo atributo ou elemento que referenciar nosso arquivo deverá conter o prefixo xs. Para saber mais sobre sobre arquivos XML, XSD recomendo os links abaixo:
http://en.wikipedia.org/wiki/XML_namespace
http://www.w3schools.com/schema/schema_complex_indicators.asp

Após adicionar o namespace conforme descrito acima, vamos agora alterar o nome da variável de entrada e definir seus atributos. Como a intenção deste post é passar N elementos no momento do insert na base de dados, vamos definir um nome para uma lista. No meu caso a variável de entrada ficou conforme apresentado a seguir. Note que o tipo consta o prefixo XS que definimos em nosso namespace anteriormente.

<element name="EntradaLista" type="xs:ListaFor" minOccurs="0"
maxOccurs="unbounded" nillable="true"/>

Agora temos que definir quais serão as variáveis que devem ser iteradas na lista que criamos acima. Para isso definimos um tipo complexo, passando qual a sequência da execução e seus elementos.

<complexType name="ListaFor">
<sequence>
<element name="nome" type="string"/>
<element name="idade" type="integer"/>
<element name="fone" type="string"/>
</sequence>
</complexType>

Note que no tipo complexo que acabamos de definir não foi definimos nenhum atributo para os elementos, pois, ao criamos a lista já definimos que o números mínimo e máximo de vezes que deve ocorrer (minOccurs e maxOccurs). Ao término, seu xsd deverá estar conforme apresentado a seguir:

<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://bpelwithforanddbadapter.bpel.gualda.com.br/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter"
xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://bpelwithforanddbadapter.bpel.gualda.com.br/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter/BPELWithFORAndBDAdapter">
<element name="process">

<complexType>
<sequence>
<element name="EntradaLista" type="xs:ListaFor" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
</sequence>
</complexType>
</element>

<element name="processResponse">
<complexType>
<sequence>
<element name="result" type="string"/>
</sequence>
</complexType>
</element>

<complexType name="ListaFor">
<sequence>
<element name="nome" type="string"/>
<element name="idade" type="integer"/>
<element name="fone" type="string"/>
</sequence>
</complexType>
</schema>

Retornando ao BPEL para concluir as definições, adicione o DbAdapter configurando o service name, definindo sua conexão com a base e colocando o nome correto no JNDI. Depois, defina a operação que deseja utilizar, para este post vou utilizar a opção “Execute Pure SQL” e clique em next, será aberta uma tela de Custom SQL onde devemos inserir nosso script de inserção. Note que ao inserirmos o script no campo SQL automaticamente o XSD é gerado de forma automática. No XSD gerado você pode alterar o tipo de dados se necessário. Veja a imagem abaixo:

Clique em next, finish e para concluir o Partner Link clique em OK.

Agora, adicione o invoke dentro do ForEach e vamos editar, de um nome, no meu caso insert, selecione o partner link clicando na lupa . O partner link refere-se ao DbAdapter que criou anteriormente, crie a variável de entrada e clique em OK.

Vamos agora concluir as definições do ForEach, clique com o botão direito para editar, defina um nome para para algo mais amigável, no meu caso será ExemploInsertFor, em Counter Name defina um nome para o contador que está sendo criado, neste exemplo está como “contador”. Veja imagem abaixo:

 


Note que abaixo do nome do contador podemos definir a execução em paralelo, isso é útil quando a ordem de execução não for importante. Agora clique na aba “Counter Values” para definirmos os valores de início e fim. Na expressão do valor inicial coloque 1, isso fará com que o contador inicie a partir do 1, 2, 3…. e assim sucessivamente. Já na expressão do valor final vamos definir como valor máximo o valor que será passado na lista de entrada, para isso, clique em Expression  para abrir o Expression Builder, dentro do campo Expression utilize o recurso de auto completar para adicionar as informações. No final, nossa expressão deverá estar conforme apresentado abaixo:

Note que a função ora:countNodes é responsável por fazer a função de “contar” a quantidade de elementos que será passado, e logo temos qual a variável que será utilizada como parâmetro de contagem. Clique em OK. A tela do For Each em Counter Values deverá estar conforme apresentado abaixo:

Clique em OK.
Adicione um Assign antes do invoke e clique com o botão direito para editar. Com o Edit Assign aberto, expanda do lado direito o inputVariable do DbAdapter até que as variáveis estejam visíveis. Agora, adicione um expression para cada variável, para isso, basta arrastar um  sobre as variáveis. Ao efetuar esse passo a tela de Expression Builder será aberta para definição das expressão de execução. Para cada variável o expressão deverá ficar assim:

$inputVariable.payload/client:EntradaLista[$contador]/client:nome

Para um breve entendimento, na lista de entrada é atribuído o contador, contador que será responsável por definir quantas vezes a variável nome (client:nome) será exibida para preenchimento. Clique em OK. Repita o procedimento para as demais variáveis. Antes de finalizar, clique sobre a aba General e dê um nome mais amigável para o assign. A tela do Edit Assign deverá ficar conforme apresentado abaixo:

Feito isso, efetue o deploy da aplicação. Veja como efetuar deploy da aplicação em: http://brunogualda.com.br/como-efetuar-deploy-do-jdeveloper-no-weblogic/. Acesse a url do servidor em http://localhost:7001/em (no meu caso), clique sobre a aplicação BPELWithForAndDBAdapter, deverá carregar uma tela conforme apresentada abaixo:

Note que nossa EntradaLista, refere-se a variável de entrada é um array e o box com valor 0 é a quantidade de vezes que desejamos repetir nossas variáveis. Vou passa o valor 2 e clicar sobre o ícone , a página será atualiza e irá notar que os elementos fora “duplicados”, pois refere-se ao valor 2 que passamos no list, se alterar esse valor para mais, os campos serão inseridos conforme a quantidade informada. Preencha os campo de cada elemento e clique em Test Web Service. Se tudo ocorrer conforme o esperado, você irá notar que os campos foram inseridos na base.

Download do projeto

Testebot