Artigo
· Out. 11 7min de leitura

Desenvolvendo Integrações com o InterSystems IRIS - File Inbound Adapter

Projeto 2 - Integração utilizando File Inbound Adapter

Vamos montar nossa próxima integração utilizando o adaptador de arquivos, o File Inbound Adapter. Este adaptador permite monitorar um diretório e buscar arquivos que estejam disponíveis com a máscara informada para o arquivo a ser lido. Após o processamento podemos mover o arquivo para uma outra área ou simplesmente eliminar o arquivo processado, conforme seja mais interessante para seu processo.

O primeiro passo é criar as mensagens da integração. Vamos criar o Request e o Response que iremos utilizar para trafegar as mensagens pelo barramento:

Class ws.file.msg.Request Extends Ens.Request
{
Property arquivo As %String;

Property registro As %Integer;

Property origem As %String;

Property nome As %String;

Property sexo As %String;

Property animal As %String;
}

 

Class ws.file.msg.Response Extends Ens.Response
{
Property status As %Boolean;

Property mensagem As %String;

Property sessionId As %Integer;
}

 

Note que Request tem como superclasse Ens.Request e Response tem como superclasse Ens.Response. Isso é importante para que as funcionalidades do barramento estejam disponíveis nas mensagens. Após criar nossas mensagens de Request e Response Vamos criar nosso BS, que é quem vai receber as requisições:

Class ws.file.bs.Service Extends Ens.BusinessService
{

Parameter ADAPTER = "EnsLib.File.InboundAdapter";

Method OnProcessInput(pInput As %RegisteredObject, pOutput As %RegisteredObject) As %Status
{

  Set $ZT="trap"

  Set counter=1 //records read
  While 'pInput.AtEnd {
    Set line=pInput.ReadLine()

    Set tRequest=##class(ws.file.msg.Request).%New()
    Set tRequest.origem="FILE"
    Set tRequest.arquivo=pInput.Filename
    Set tRequest.registro=counter
    Set tRequest.nome=$piece(line,"^",1)
    Set tRequest.sexo=$piece(line,"^",2)
    Set tRequest.animal=$piece(line,"^",3)

    Set tSC=..SendRequestSync("bpFile",tRequest,.tResponse)
    
    If 'tSC
    {
               $$$LOGERROR("Não conseguiu gravar pessoa no. " _ counter)
    }
    set counter=counter+1
  }

  $$$LOGINFO("Total de pessoas carregadas: " _ (counter - 1))
  Set $ZT=""
  Quit $$$OK

trap
  $$$LOGERROR("Erro carregando registro no. " _ counter _ " - " _ $ZERROR)
  SET $ECODE = ""
  Set $ZT=""
  Quit $$$OK
}

}

Note que nosso BS usa o adaptador EnsLib.File.InboundAdapter. Isso habilita nosso BS a trabalhar com arquivos para a entrada do BS. Vamos precisar depois realizar algumas configurações no BS, mas faremos isso quando formos coloca-lo na produção.

Agora vamos criar nosso BO conforme abaixo:

Class ws.file.bo.Operation Extends Ens.BusinessOperation [ ProcedureBlock ]
{

Method gravaPessoa(pRequest As ws.file.msg.Request, Output pResponse As ws.file.msg.Response) As %Library.Status
{
 Set pResponse=##Class(ws.demo.msg.Response).%New()
 Set pResponse.status=1
 Set pResponse.mensagem="OK"
 Set pResponse.sessionId=..%SessionId
 Set obj=##Class(ws.file.data.Pessoa).%New()
 Set obj.arquivo=pRequest.arquivo
 Set obj.registro=pRequest.registro
 Set obj.origem=pRequest.origem
 Set obj.nome=pRequest.nome
 Set obj.sexo=pRequest.sexo
 Set obj.animal=pRequest.animal
 Set st=obj.%Save()
 If 'st
 {
              Set pResponse.status=0
              Set pResponse.mensagem=$SYSTEM.Status.GetErrorText(st)
 }
 Quit $$$OK
}

XData MessageMap
{
<MapItems>
              <MapItem MessageType="ws.file.msg.Request">
                            <Method>gravaPessoa</Method>
              </MapItem>
</MapItems>
}

}

 

Aqui no BO temos a estrutura XData que recebe qual a classe que vai chegar e direciona para o método que deve tratar aquela entrada.

Note também que neste BO não estamos utilizando nenhum adaptador. Ele trabalha sem fazer chamadas externas. Desta fora não vamos precisar para este exemplo de nenhum tipo de comunicação. As próximas integrações já teremos chamadas externas.

Agora, por fim, vamos montar nosso BP, que é o orquestrador das chamadas da integração. No nosso exemplo teremos apenas uma única chamada, mas nosso BP poderia orquestrar chamadas para diversos BOs.

 

 

O código do nosso BP ficará assim:

/// 
Class ws.file.bp.Process Extends Ens.BusinessProcessBPL [ ClassType = persistent, ProcedureBlock ]
{

/// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl]
{
<process language='objectscript' request='ws.demo.msg.Request' response='ws.demo.msg.Response' height='2000' width='2000' >
<sequence xend='200' yend='350' >
<call name='boFile' target='boFile' async='0' xpos='200' ypos='250' >
<request type='ws.file.msg.Request>
<assign property="callrequestvalue="requestaction="set" languageOverride="" />
</request>
<response type='ws.file.msg.Response>
<assign property="responsevalue="callresponseaction="set" languageOverride="" />
</response>
</call>
</sequence>
</process>
} Storage Default
{
<Type>%Storage.Persistent</Type>
}

}

Agora vamos utilizar a production que criamos no exemplo anterior e colocar as classes nela.

Clique no botão (+) ao lado do título Services e inclua o nosso BS conforme a tela abaixo:

 

 

Vamos agora complementar a configuração do BS informando o diretório que deve ser monitorado e a máscara de arquivo a pesquisar. Para isso clique sobre o nome do nosso BS e vá para a aba Configuração. Informe o ‘Caminho do Arquivo’ e ‘Mascara de Seleção de Arquivos’. Confirme que a caixa ‘Habilitado’ está marcada:

 

 

Pronto. Nosso BS está configurado. Agora vamos passar para o nosso BO. O processo é o mesmo, ou seja, clique no botão (+) ao lado do título Operations e preencha a tela que será apresentada:

A seguir clique no botão (+) ao lado do título Process para incluir o nosso BP:

 

 

Preencha a tela conforme acima e clique em OK.

 

 

 

 

Preencha a tela conforme acima, clique em OK e teremos nosso BO na produção.

 

Temos nossos 3 componentes configurados na produção. Clique na bola verde ao lado de bpFile para ver as conexões entre os componentes:

 

 

 

 

 

Confirme que você importou a classe ws.file.data.Pessoa. Você pode fazer isso no Studio:

 

 

Utilize o SQL Explorer para verificar o conteúdo da tabela referente a nossa classe:

 

 

Colocamos o nosso BS para monitorar o diretório c:\temp\files e neste diretório pesquisar os arquivos de máscara *.txt. Quando um arquivo chegar no diretório ele será lido, processado e depois eliminado.

 

Vamos ver um arquivo com dados para serem importados:

 

 

 

Vamos colocar esse arquivo no diretório que está sendo monitorado pela nossa integração. Veja que alguns segundos depois o arquivo irá ser eliminado:

 

 

 

Logo depois de ser processado o arquivo será eliminado do diretório:

 

 

E você pode então consultar nossa tabela e ver que ela foi populada com os dados do arquivo:

 

 

 

 

E também verificar o trace da nossa integração:

 

 

Note no nosso trace que temos uma marcação de LOG que foi criada pelo nosso BS na linha de código abaixo:

$$$LOGINFO("Total de pessoas carregadas: " _ (counter - 1))

Ela gera no trace uma marcação que pode ser observada, conforme a tela abaixo:

 

Assim fechamos nossa segunda integração. As classes envolvidas estão no pacote de download, basta baixar o pacote e importar para dentro do seu namespace. Após isso você pode abrir todas as classes e verificar todos os pontos.

Utilizamos em nosso teste o IRIS 2024.1 que disponível para download na sua versão Community na internet. E veja o tutorial de instalação do IRIS que também está disponível no nosso conjunto de documentos.

Até a próxima!

Discussão (0)1
Entre ou crie uma conta para continuar