BPEL

Trabalhando com FileAdapter no BPEL – Parte 3: Gravando o conteúdo do arquivo no Banco de Dados

Vamos agora realizar a gravação do conteúdo do nosso arquivo citado na Parte 2 em nosso Banco de Dados, lembrando que para todos os projetos que desenvolvo aqui no Blog eu uso as tabelas já existente ao instalarmos o Oracle XE.

Faremos a gravação do conteúdo do arquivo.txt em nossa tabela DEPARTMENT que já vem criada automaticamente ao instalarmos nosso Banco.

Consulte os Links abaixo para verificar as demais partes deste nosso Projeto:

Para esta parte do Projeto vamos precisar usar o DBAdapter para fazer o Insert das informações no banco de dados, para isso vou utilizar nosso projeto já criado aqui no Blog que é o InsertDBAdapter.

Então importe este projeto para que fique conforme abaixo:

Imagem Blog UansCarvalho

Agora em nosso projeto FileAdapterBPEL vamos precisar chamar nosso Serviço InsertDBAdapter e para isso vamos precisar importar para dentro do nosso projeto o WSDL e XSD do InsertDBAdapter

Então faça o Deploy Local no seu JDeveloper deste projeto InsertDBAdapter:

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 do BPEL

Faça o Login:

Imagem Blog UansCarvalho

Clique no seu projeto: InsertDBAdapter[1.0]

Imagem Blog UansCarvalho

Clique em Test

Imagem Blog UansCarvalho

Em WSDL copie o caminho: http://localhost:10000/soa-infra/services/default/InsertDBAdapter/insertdbadapterbpel_ep?WSDL

Imagem Blog UansCarvalho

Cole agora na URL do seu Browser e com o botão direito clique em View Page Source:

Abaixo veja parte do WSDL

Imagem Blog UansCarvalho

Copie o conteúdo e crie um arquivo no seu BPEL com o nome InsertDbAdapter.wsdl e cole o conteúdo que copiamos acima.

Imagem Blog UansCarvalho

Deverá então ficar conforme estrutura abaixo:

Imagem Blog UansCarvalho

Agora copie o InsertDBAdapterBPELProcess.xsd que esta dentro do seu Projeto InsertDBAdapter para dentro do nosso projeto FileAdapterBPEL na pasta XSD conforme abaixo:

Imagem Blog UansCarvalho

Agora abra seu arquivo InsertDbAdapter.wsdl do seu projeto FileAdapterBPEL

Veja a linha onde está o import do InsertDBAdapterBPELProcess.xsd que está assim:

<import namespace="http://xmlns.oracle.com/UansBlogApplication/InsertDBAdapter/InsertDBAdapterBPELProcess"
schemaLocation="http://localhost:10000/soa-infra/services/default/InsertDBAdapter/insertdbadapterbpel_ep?XSD=xsd/InsertDBAdapterBPELProcess.xsd"/>

Altere apenas o schemaLocation para que fique assim:

<import namespace="http://xmlns.oracle.com/UansBlogApplication/InsertDBAdapter/InsertDBAdapterBPELProcess"
schemaLocation="xsd/InsertDBAdapterBPELProcess.xsd"/>

Pronto, isso já resolverá o problema do nosso WSDL

Agora volte ao seu composite.xml e arraste o componente Web Service para External References

Imagem Blog UansCarvalho

Coloque as seguintes configurações:

  • Name: InsertDbAdapter
  • WSDL URL: Procure o WSDL InsertDbAdapter.wsdl que copiamos para dentro do nosso projeto FileAdapterBPEL conforme passos anteriores.
  • Port Type: InsertDBAdapterBPELProcess
  • Callback Port Type: —- No Callback —–

Imagem Blog UansCarvalho

Agora ligue nosso LerArquivoBPELProcess para nosso Web Service InsertDbAdapter e deverá ficar conforme abaixo:

Imagem Blog UansCarvalho

Abra agora nosso arquivo dadosArquivo.xsd e vamos renomear alguns campos para ficarem claros que representam na nossa Tabela DEPARTMENT de nosso banco de dados XE onde deverão ser gravados os dados que estarão dentro de nosso arquivo.txt

Está conforme abaixo:

xsd:element name="Arquivo">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Arquivo" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="header" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" />
              <xsd:element name="detail" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" />
              <xsd:element name="detail" type="xsd:string" nxsd:style="fixedLength" nxsd:length="9" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Altere apenas os nomes, header, detail e o segundo detail para que fique assim:

xsd:element name="Arquivo">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Arquivo" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="numeroDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" />
              <xsd:element name="nomeDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" />
              <xsd:element name="localDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="9" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Abra agora nosso LerArquivoBPELProcess.bpel

Dentro do Loop (LendoArquivo), abaixo da caixa Empty DadosProcessados arraste um componente For Each pois ele será necessário para iterarmos as linhas do conteúdo do nosso arquivo.

Renomeie nosso For Each para ForEachLinhas e deverá ficar assim:

Imagem Blog UansCarvalho

Abra o For Each e coloque o seguinte:

  • Name: ForEachLinhas
  • Counter Name: ForEachContador

Imagem Blog UansCarvalho

Clique agora na guia Counter Values e em:

  • Start Value em Expression coloque o valor 1
  • Final Value em Expression clique ao lado no ícone que parece uma calculadora e coloque a expressão abaixo:
ora:countNodes('InvokeLerArquivo_SynchRead_OutputVariable','body','ns4:Arquivo')

Obs: Veja que estou usando a função ora:countNodes() para iterarmos nosso elemento Arquivo que representa nossa lista conforme definido no nosso XSD dadosArquivo.xsd

Então primeiro insira a função ora:countNodes() e dentro dos parênteses da função aperte a tecla Control + Espaço do seu teclado e escolha a opção InvokeLerArquivo_SynchRead_OutputVariable agora coloque uma virgula , e novamente aperte Control + Espaço então escolha body e novamente coloque uma virgula , e aperte Control + Espaço e escolha a opção ns4:Arquivo e agora coloque esse ultimo entre aspas simples, no caso ‘ns4:Arquivo’

Veja como ficará:

Imagem Blog UansCarvalho

Veja acima que os nomes ficaram logo após uma virgula e estão entre aspas simples, isso é muito importante ou ocorrerão erros posteriores em função disto

Então posteriormente teremos a seguinte tela:

Imagem Blog UansCarvalho

Agora para dentro do nosso For Each arraste um Assing e renomeie para IniciaVariaveisInvoke e abaixo arraste um Invoke e renomeie para InvokeInsertDbAdapterBPEL

Imagem Blog UansCarvalho

Ligue nosso InvokeInsertDbAdapterBPEL para o InsertDbAdapter que está em nosso Partner Links

Em Input clique no Sinal de + para definirmos nossa variável de Input e clique em OK em seguida

Imagem Blog UansCarvalho

Agora abra nosso IniciaVariaveisInvoke e vamos ligar a saída do OutPut do InvokeLerArquivo com o Input de nosso InsertDBAdapterBPELProcess

Imagem Blog UansCarvalho

Ainda nesta tela em From do seu lado esquerdo dê um duplo clique na linha onde ligamos o numeroDepartamento

Ele estará com a seguinte Expression:

$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo/ns4:numeroDepartamento

Então altere para

number($InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:numeroDepartamento)

Para que você entenda:

Usei a função number() para converter o numeroDepartamento para um tipo numérico já que no XSD dadosArquivo.xsd ele é String e no Banco de Dados é um NUMBER

Usei o nome o [$ForEachContador] depois de Arquivo pois ele é a nossa lista e será o que irá repetir, por isso a cada repetição do nosso For Each ele irá iterar também as linhas de nosso arquivo

Faça também o mesmo procedimento colocando o [$ForEachContador] para as Expressions, no caso ficará assim:

$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:nomeDepartamento
$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:localDepartamento

Vamos agora testar nosso processo:

Faça o deploy localmente do seu projeto lembrando de apontar para nosso arquivo FileAdapterBPEL_cfgplan.xml

Imagem Blog UansCarvalho

Vamos fazer o teste para ter certeza que tudo funcionou perfeitamente.

Vá no diretorio /home/uans/Arquivos (ou onde você definiu o caminho conforme seu Config Plan) e abra o arquivo.txt

Dentro dele coloque o seguinte conteúdo:

1011 SIST SAOPAULO
1012 SIST BRASILIA
1013 SIST PENAPOLI

Obs: Lembre-se que não podem haver espaços no final dos nomes para não termos problemas

Agora para se certificar de que seus dados foram inseridos com sucesso, veja no seu banco de Dados o conteúdo que colocamos no arquivo.txt acima foi inserido na tabela corretamente

Obs: Lembre-se que nosso processo esta verificando nossa pasta onde esta o arquivo.txt de 5 em 5 segundos

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

Leave a Reply

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