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:
- Trabalhando com FileAdapter no BPEL – Parte 1: Lendo o arquivo de um diretório
- Trabalhando com FileAdapter no BPEL – Parte 2: Lendo o conteúdo do arquivo
- Trabalhando com FileAdapter no BPEL – Parte 3: Gravando o conteúdo do arquivo no Banco de Dados
- Trabalhando com FileAdapter no BPEL – Parte 4: Renomeando ou Movendo um arquivo
- Trabalhando com FileAdapter no BPEL – Parte 5: Deletando um arquivo
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
Agora abra o composite.xml do projeto FileAdapterBPEL e arraste um File Adapter para External References e conforme tela abaixo clique em Next
Em Service Name coloque LerArquivo e clique em Next
Abaixo deixe marcado a opção Define from operation and schema (specified later)
Abaixo clique em Synchronous Read File e clique em Next
Clique agora em Logical Name coloque FILE_IN e clique em Next
Em File Name coloque o nome arquivo.txt e clique em Next
Clique agora na Lupa e procure o arquivo dadosArquivo.xsd que criamos, clique em Arquivo e posteriormente em OK
Feito isso teremos a tela abaixo, então clique em Next:
Clique agora em Finish
Teremos agora a seguinte tela:
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:
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:
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
Teremos então a seguinte tela:
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.
Então deveremos ter a seguinte tela:
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
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:
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
Marque também a opção Create Instance
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:
Na tela acima clique em OK agora faça o mesmo procedimento acima agora para armazenarmos nosso diretorio para que tenhamos a tela abaixo:
Clique em OK na tela acima
Ficará então assim:
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’
Desta maneira teremos a condição $isEOF = ‘false’ até que você não chegue ao Fim do Arquivo.
Agora dentro do seu Loop arraste um componente Invoke
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
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
Agora em From faça o mesmo procedimento:
Agora abaixo do seu LerArquivoBPELProcess.bpel clique em Source
No final do processo procure a linha <bpelx:toProperties> e <bpelx:fromProperties> conforme abaixo:
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.LineNumber e jca.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:
‘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
Teremos por enquanto a seguinte tela:
Arraste agora um componente IF para abaixo do seu InvokeLerArquivo, renomei o IF para DadosEncontrados e coloque a seguinte condição:
- $noDataFound = ‘false’
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:
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
Clique em OK
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>
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:
Clique no seu projeto: FileAdapterBEL[1.0]
Veja que uma instância foi criada.
Clique sobre este Instãncia e posteriormente em LerArquivoBPELProcess
Clique agora na guia Flow e em seguida em InvokeLerArquivo
Vá até o final do arquivo e veja o seu Payload de OutPut
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