Tags

, , , ,

Nesta Parte 2 vamos dar continuidade ao Post anterior onde criamos o processo para ler o arquivo de um diretório, agora neste Post vamos criar o processo para ler o conteúdo do arquivo com o nosso BPEL.

Algo que acrescentaremos ao nosso processo será a leitura dinâmica do conteúdo deste arquivo pois iremos ler o arquivo em pedaços caso este arquivo seja muito grande.

Consulte os Links abaixo para verificar as demais partes:

Nosso primeiro passo será criar um arquivo dadosArquivo.xsd onde terá as informações referentes ao conteúdo do nosso arquivo, para isso crie o arquivo e copie e cole o conteúdo abaixo.

<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            xmlns:tns="http:/uanscarvalho/blog/ArquivoFile"
            targetNamespace="http:/uanscarvalho/blog/ArquivoFile"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"

            nxsd:version="NXSD"
            nxsd:stream="chars"
            nxsd:encoding="US-ASCII"
>


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

Veja onde devemos salvar o arquivo dadosArquivo.xsd

Imagem Blog UansCarvalho

Agora abra o composite.xml do projeto FileAdapterBPEL e arraste um File Adapter para External References e conforme tela abaixo clique em Next

Imagem Blog UansCarvalho

Em Service Name coloque LerArquivo e clique em Next

Imagem Blog UansCarvalho

Abaixo deixe marcado a opção Define from operation and schema (specified later)

Imagem Blog UansCarvalho

Abaixo clique em Synchronous Read File e clique em Next

Imagem Blog UansCarvalho

Clique agora em Logical Name coloque FILE_IN e clique em Next

Imagem Blog UansCarvalho

Em File Name coloque o nome arquivo.txt e clique em Next

Imagem Blog UansCarvalho

Clique agora na Lupa e procure o arquivo dadosArquivo.xsd que criamos, clique em Arquivo e posteriormente em OK

Imagem Blog UansCarvalho

Feito isso teremos a tela abaixo, então clique em Next:

Imagem Blog UansCarvalho

Clique agora em Finish

Imagem Blog UansCarvalho

Teremos agora a seguinte tela:

Imagem Blog UansCarvalho

Até agora, acabamos de criar um adaptador de arquivo fazendo uma leitura síncrona, agora vamos modificá-lo para que ele leia o arquivo em pedaços. Isto é feito através da modificação do arquivo LerArquivo_file.jca.

Então abra o arquivo conforme abaixo:

Imagem Blog UansCarvalho

Veja acima na linha da tag <interaction-spec onde temos:

<interaction-spec className="oracle.tip.adapter.file.outbound.FileReadInteractionSpec">

Altere para:

<interaction-spec className="oracle.tip.adapter.file.outbound.ChunkedInteractionSpec">

E acrescente a propriedade abaixo, no valor desta propriedade “50” estou definindo que o arquivo será lido em linhas de 50 em 50, em um Post posterior irei mostrar como usar esta função passo a passo, por hora é interessante você saber que existe

<property name="ChunkSize" value="50"/>

Então deverá ficar assim:

Imagem Blog UansCarvalho

Salve e feche o arquivo.

Vamos agora criar o processo BPEL que irá realmente ler o conteúdo do nosso arquivo.

  • Arraste um BPEL Process para Components
  • Marque a opção BPEL 2.0 Specification
  • Coloque o nome LerArquivoBPELProcess
  • Em Template escolha a opção Define Service Later
  • Clique em OK

Imagem Blog UansCarvalho

Teremos então a seguinte tela:

Imagem Blog UansCarvalho

Então agora arraste a seta do LerArquivo para seu processo BPEL e em seguida arraste a seta do seu CapturaArquivo também, veja que aparecerá a tela abaixo, então clique em OK.

Imagem Blog UansCarvalho

Então deveremos ter a seguinte tela:

Imagem Blog UansCarvalho

Abra seu processo BPEL e acrescente as seguintes variaveis:

  • dir, tipo string – Armazenará o nome do arquivo
  • file, tipo string – Armazenará o diretório onde o arquivo estará
  • isEOF, tipo string – Especifica o final do arquivo
  • lineNumber, tipo string – Especifica o numero da linha do arquivo
  • columnNumber, tipo string – Especifica o numero da coluna do arquivo
  • noDataFound, tipo string – Especifica se não há mais dados para ler
  • isMessageRejected, tipo string – Especifica se ocorrerá erro no processo
  • rejectionReason, tipo string – Especifica o erro do processo caso ocorra

Imagem Blog UansCarvalho

O Processo BPEL deverá começar quando o arquivo for capturado pelo nosso File Adapter “CapturaArquivo”

Então ainda no seu processo BPEL, dentro dele arraste o componente Receive, em seguida renomeie para ReceiveCapturaArquivo e deverá ficar conforme tela abaixo:

Imagem Blog UansCarvalho

Agora arraste a seta do seu ReceiveCapturaArquivo para nosso CapturaArquivo e na tela abaixo clique no + para definir nossa variável de Input e clique em OK

Imagem Blog UansCarvalho

Marque também a opção Create Instance

Imagem Blog UansCarvalho

Agora clique em Properties e vamos adicionar duas propriedades para armazenarmos o nome e diretorio do arquivo recebido.

Em Properties clique no sinal + e em Name: procure o nome jca.file.FileName e em Variable procure nossa variavel file e deveremos ter a seguinte tela:

Imagem Blog UansCarvalho

Na tela acima clique em OK agora faça o mesmo procedimento acima agora para armazenarmos nosso diretorio para que tenhamos a tela abaixo:

Imagem Blog UansCarvalho

Clique em OK na tela acima

Ficará então assim:

Imagem Blog UansCarvalho

Agora para conseguirmos processar cada linha do arquivo será preciso criar um Loop.

Arraste o componente While para que fique abaixo do ReceiveCapturaArquivo e renomeie para LendoArquivo e dentro da Condição sete isEOF para false: $isEOF = ‘false’

Imagem Blog UansCarvalho

Desta maneira teremos a condição  $isEOF = ‘false’ até que você não chegue ao Fim do Arquivo.

Imagem Blog UansCarvalho

Agora dentro do seu Loop arraste um componente Invoke

Imagem Blog UansCarvalho

Arraste agora a seta do seu Invoke para LerArquivo do seu Parter Links e dentro de Edit Invoke deixe como abaixo:

  • Name: InvokeLerArquivo
  • Input: Clique no sinal de + para criar sua variável de Input automaticamente
  • Output: Clique no sinal de + para criar sua variável de Output automaticamente

Imagem Blog UansCarvalho

Clique agora na aba Properties e em To clique no sinal + para adicionar e ligar as seguintes variáveis

  • jca.file.FileName para $file
  • jca.file.Directory para $dir

Imagem Blog UansCarvalho

Agora em From faça o mesmo procedimento:

Imagem Blog UansCarvalho

Agora abaixo do seu LerArquivoBPELProcess.bpel clique em Source

Imagem Blog UansCarvalho

No final do processo procure a linha <bpelx:toProperties> e <bpelx:fromProperties> conforme abaixo:

Imagem Blog UansCarvalho

Aqui vamos ligar mais algumas variáveis, neste caso “deveríamos” conseguir fazer isso pela tela gráfica como fizemos anteriormente para jca.file.Directory e jca.file.FileName mas infelizmente não conseguimos pois na lista do processo para adicionar as propriedades não aparece jca.file.LineNumberjca.file.ColumnNumber entre outras, por algum Bug da ferramenta, e então faremos por aqui, então adicione as seguintes variáveis para:

<bpelx:toProperties>

  • <bpelx:toProperty name=”jca.file.LineNumber” variable=”lineNumber”/>
  • <bpelx:toProperty name=”jca.file.ColumnNumber” variable=”columnNumber”/>

e para:

<bpelx:fromProperties>

  • <bpelx:fromProperty name=”jca.file.LineNumber” variable=”lineNumber”/>
    <bpelx:fromProperty name=”jca.file.ColumnNumber” variable=”columnNumber”/>
  • <bpelx:fromProperty name=”jca.file.IsEOF” variable=”isEOF”/>
    <bpelx:fromProperty name=”jca.file.IsMessageRejected” variable=”isMessageRejected”/>
  • <bpelx:fromProperty name=”jca.file.RejectionReason” variable=”rejectionReason”/>
  • <bpelx:fromProperty name=”jca.file.NoDataFound” variable=”noDataFound”/>

Obs: Veja que excluímos as propriedades jca.file.Directory e jca.file.FileName pois foi necessárias adiciona-las anteriormente apenas para aparecerem no código fonte no Source

Então ficaremos com o seguinte código fonte:

Imagem Blog UansCarvalho

‘false’ to variable ‘isEOF’, ‘1’ to ‘lineNumber’ and ‘columnNumber’.

Volte para o Design da tela, arraste um Assign antes do nosso Loop para iniciarmos algumas variaveis:

Renomeie nosso Assing para IniciaVariaveis e dentro do assign sete as seguintes variaveis:

  • isEOF = ‘false’
  • lineNumber = 1
  • columnNumber = 1

Imagem Blog UansCarvalho

Teremos por enquanto a seguinte tela:

Imagem Blog UansCarvalho

Arraste agora um componente IF para abaixo do seu InvokeLerArquivo, renomei o IF para DadosEncontrados e coloque a seguinte condição:

  • $noDataFound = ‘false’

Imagem Blog UansCarvalho

No seu IF acrescente um componente Empty e renomei para DadosProcessados e arraste outro Empty para seu ELSE e renomeie para DadosNaoEncontrados

Teremos então a seguinte tela:

Imagem Blog UansCarvalho

Agora assim como fizemos na primeira parte vamos gerar um novo Config Plan, por isso apague o anterior e crie novamente.

Clique com o botão direito no seu composite.xml e clique em Generate Config Plan

Imagem Blog UansCarvalho

Clique em OK

Imagem Blog UansCarvalho

Abra seu arquivo FileAdapterBPEL_cfgplan.xml e procure pela tag <service name=”CapturaArquivo”> e abaixo, em <replace> coloque /home/uans/Arquivos (ou conforme você queira mas lembre-se de criar esta sequência de diretorios em seu home com as permissões necessárias)

<service name=”CapturaArquivo”>
<property name=”FILE_IN”>
<replace>/home/uans/Arquivos</replace>
</property>
<binding type=”jca”/>
</service>

Faça o mesmo procedimento para a tag  <reference name=”LerArquivo”>

<reference name=”LerArquivo”>
<property name=”FILE_IN”>
<replace>/home/uans/Arquivos</replace>
</property>
<binding type=”jca”/>
</reference>

Imagem Blog UansCarvalho

Faça o deploy do seu projeto usando este Config Plan:

Obs: Se tiver duvidas como fazer este procedimento verifique na Parte 1

Crie um arquivo chamado arquivo.txt e coloque a estrutura abaixo:

UANS BLOG CARVALHO
FILE READ ARQUIVOS

Atenção para no final do CARVALHO para não ter espaços em branco e em ARQUIVOS também pois o processo é posicional, ou seja irá respeitar a posição dos caracteres, veja também como coloquei os caracteres: 4 letras + espaço + 4 letras + espaço + 8 letras conforme definimos em nosso dadosArquivo.xsd

Agora copie e cole este arquivo.txt para dentro de /home/uans/Arquivos (ou o que você definiu no seu Config Plan)

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: FileAdapterBEL[1.0]

Imagem Blog UansCarvalho

Veja que uma instância foi criada.

Imagem Blog UansCarvalho

Clique sobre este Instãncia e posteriormente em LerArquivoBPELProcess

Imagem Blog UansCarvalho

Clique agora na guia Flow e em seguida em InvokeLerArquivo

Imagem Blog UansCarvalho

Vá até o final do arquivo e veja o seu Payload de OutPut

Imagem Blog UansCarvalho

 

Veja que ele criou uma tag <Arquivo> para cada linha do seu arquivo.txt

Para realizar mais testes e verificar o que nosso projeto é capaz tente agora alterar o arquivo dadosArquivo.xsd e modificar o arquivo.txt.

 

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

 

Abraços e até a Próxima

/:-D