新しい投稿

検索

記事
· 2024年10月11日 7m read

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!

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
質問
· 2024年10月11日

Connection to DB problem

Hello,

Could not connect to DB using IRIS studio, and I don`t know why, maybe someone can help.

Checked already user - it have %All rights

Also, tried using _SYSTEM user, but the same error is occured.

Does anyone have suggestions, I will appreciate your help.

Providing some screenshots regarding this problem.

 

4 Comments
ディスカッション (4)3
続けるにはログインするか新規登録を行ってください
ディスカッション
· 2024年10月11日

Why developers should adopt IRIS instead of other database and interoperability tools?

Hi Team, we are going to deliver a speech on a developer forum where most developers hv not used our tech before but using other database and integration technologies , Pls give us some key points on why they should adopt us and the benefits you can get, especially if you change your tech stack from others to IRIS. Thanks a lot!

3 Comments
ディスカッション (3)1
続けるにはログインするか新規登録を行ってください
質問
· 2024年10月10日

Rename function in class %File is not removing files from the original folder

SOURCFILE="/home/user1/file1.dat"

DESTFILE="/opt/users/file1.dat"

##class(%File).Rename(SOURCFILE,DESTFILE,.STATUS) when this is executed in IRIS,  SOURCEFILE is getting moved to the folder in DESTFILE but it is not getting deleted from SOURCEFILE folders. Same call is working as expected in cache. Has anyone experienced this issue? We are trying convert to IRIS from cache.

 

2 Comments
ディスカッション (2)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 2024年10月10日

InterSystems Global Masters - 欢迎回来(测试版)

各位社区成员,大家好

Global Masters 已开启!

使用 InterSystems SSO 登录

使用 >> [此链接] << 访问平台,并使用您的 InterSystems SSO 登录。

请注意,在最近的测试中,我们发现一些用户在尝试通过这种方式登录时会遇到错误。 我们目前正在与供应商共同调查问题原因。 如果您遇到此类错误,请通过私信联系我,我将向您发送手动邀请!

测试版免责声明

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください