quinta-feira, 27 de setembro de 2012

Processamento Background com Genexus

Processe grandes volumes de dados em background.

Do que se trata o post: 
Utilização de um gerador Win em um projeto Web, para a criação de uma procedure em background capaz de realizar uma tarefa em um determinado horário especificado.

As aplicações batch podem ser consideradas como programas ou rotinas executadas em segundo plano que possuem um fluxo a percorrer e sem a intervenção direta do usuário.
Genexus X

Para que servem:
Estas aplicações (background) podem realizar um processamento de dados bem superior aquelas executadas através da Web. São muito úteis para a criação de relatórios mensais, anuais com grande quantidade de dados, ou então para a geração de xml de gráficos, entre outros usos.

Conhecendo:
Primeiramente precisamos adicionar um Gerador Win ao nosso projeto, para isto, no Genexus, clique na aba Preferences (canto inferior esquerdo), após, clique com o botão direito sobre a opção GENERATORS, e selecione NEW GENERATOR.

Agora, nosso projeto terá dois geradores. Clique sobre o gerador recentemente criado e em suas Propriedades determine o modo User Interface com a opção Windows conforme figura abaixo:

Genexus Batch

Pronto nosso gerador está configurado. Agora precisamos configurar a nossa Procedure que será executada em background, determine o modo Main program com a opção True e na propriedade Generator selecione o gerador Win anteriormente criado, conforme abaixo:


Como esta procedure será Main é preciso atenção para compila-la após cada alteração. 

Executanto o processamento:
Para este nosso exemplo, programei a procedure para criar um relatório em excel contendo o nome e a cidade de dois clientes, conforme o código abaixo:

//=====Abre/Cria a planilha=====
&ExcelDocument.Open('C:\Temp\CustomerReport.xls')

//=====Limpa a planilha caso já exista=====
&ExcelDocument.Clear()

&ExcelDocument.Cells(1,1).Text = 'Clientes'
&ExcelDocument.Cells(1,2).Text = 'Cidade'

&ExcelDocument.Cells(2,1).Text = 'Fulano de Tal'
&ExcelDocument.Cells(2,2).Text = 'São Paulo'

&ExcelDocument.Cells(3,1).Text = 'Cicrano de Tal'
&ExcelDocument.Cells(3,2).Text = 'Rio de Janeiro'

//=====Salva as inserções realizadas=====
&ExcelDocument.Save()

//=====Fecha a planilha trabalhada=====
&ExcelDocument.Close()

Por fim, a execução desta procedure background poderá ser feita de duas maneiras:

1. Chamada através de uma Web Panel, por meio da função Shell:

&retorno = Shell('C:\KBs\TestesGerais\CSharpModel\bin\aprocessamentobatch.exe',0)

2. Chamada através de um programa de agendamento de execuções, recomendo o JIT Scheduler disponível aqui. Este programa é de simples configuração, podemos determinar dias, horários e intervalos de execução.

Genexus Batch

Por enquanto é só pessoal, qualquer dúvida, sugestão ou correção aguardo nos cometários. Grande Abraço.

8 comentários:

  1. Olá , tudo bem?
    Sempre que tenho alguma duvida recorro ao seu blog e ele tem me ajudado muito!
    Estou desenvolvendo um sistema integrado em que ele recebe dados via webservice de um outro. E a integração é feita em background. Gostaria de saber se conhece alguma ferramenta em que eu possa chamar arquivos .jar ou .class. Já tentei utilizar a funçao sleep do genexus porem ela faz com que a aplicação inteira "Durma" impedindo alguma qualquer ação do usuário.
    Se puder ajudar, desde já agradeço.


    Att.

    ResponderExcluir
    Respostas
    1. Oi Raul, não entendi a utilização do sleep. Para trabalhar com classes externas você precisará programar em Java diretamente do Genexus. Para isto, em uma procedure, declare o prefixo "java" antes do código. Existem dois links que poderão te ajudar:

      http://technologexus.blogspot.com.br/2012/05/reusabilidade-de-classes-externas-java.html
      http://www.gxtechnical.com/gxdlsp/pub/genexus/java/docum/manuals/8.0/mjavai2.htm

      Se por acaso você precisar desta integração para receber dados via webservice, o próprio genexus realiza isto sem a necessidade de classes externas.

      Abraço

      Excluir
  2. Olá Eduardo.
    A integração via webservice já está implementada.
    Entretanto é preciso que ele seja chamado a cada x segundos.
    Tentei utilizar a função sleep(segundos) para chamar o webservice. Mas não consigo fazer isso em background porque a função paraliza a aplicação inteira(java/win) impedindo qualquer ação do usuário.
    Por isso que pensei em utilizar um programa externo (scheduler) para ir chamando o procedimento que chama o webservice criado no genexus.

    A grande questão é chamar o webservice a cada x segundos e rodando em background sem prejudicar qualquer ação do usuário.


    Se puder ajudar, agradeço.
    Muito obrigado por responder.

    ResponderExcluir
    Respostas
    1. Oi Raul, desculpa a demora. Esta função, ela roda de maneira assíncrona ou através de interação com o usuário? Se você criar uma procedure MAIN (Gerador win), e deixá-la executando, o sleep irá funcionar sim. Para isso, provavelmente você precisará compilar pelo prompt do windows para poder roda-la como um executável.

      O JIT também realiza esta tarefa, além de rodar executáveis em horários programados, existe a possibilidade de programar para execuções repetitivas de x segundos. Para isto você deverá escolher a opção "Repeat execution periodically".

      Isso se eu entendi bem a questão..

      Excluir
  3. Boa tarde.

    Para criar um novo gerador e utilizá-lo para esses procedimentos, o modelo precisa ser Windows ou Web?

    ResponderExcluir
    Respostas
    1. Boa Noite,

      Tanto um quanto o outro permitem a criação de um novo gerador Windows. Logo, mesmo um modelo Web permitirá trabalharmos com objetos Win.

      Abraço

      Excluir
  4. Bom dia, fiz o executável, conforme o exemplo, no meu micro local do projeto, funcionou perfeitamente, porém quando tento pegar o .exe e colocar em outro micro ele não executa.

    Vem o erro: xxxxxx.exe parou de funcionar. Um problema fez que o programa parasse de funcionar corretamente. O windows fechará o programa e o notificará caso uma solução esteja disponível.

    Estou achando que falta algum arquivo que tenho que enviar junto do exe. Ja coloquei na pasta o .config, mais ainda não resolveu...

    Poderia me ajudar?

    ResponderExcluir
    Respostas
    1. Bom, além do executável é necessário copiar todas as ".dll" que se encontram dentro da pasta bin (da pasta raiz, não da pasta web).

      Além disso, se você for utilizar a função ExcelDocument, as Dlls jakarka são essenciais.

      Abraço

      Excluir