quinta-feira, 6 de setembro de 2012

Como não render-se ao Submit

Submit traduzido para o português significa submeter, submeter-se, ceder, sujeitar-se, render-se, entregar-se, e não poderia haver sinônimos mais claros e eficientes para representar esse interessante comando Genexus, pois de fato não existe aplicação que possa ceder a esse recurso.

Trata-se de um mecanismo bastante antigo na ferramenta, lá pelos idos da versão 7.0, RPG/AS400, ou seja, a turminha mais madura com certeza conhece e utiliza esse recurso, já os bebezinhos (me incluo aqui, rs), nem imaginavam que algo tão surpreendente pudesse estar tão próximo ao nosso alcance.

Chega de suspense, então, pra que serve isso mesmo?

1) Situação 1: Com certeza em sua aplicação você necessita enviar algum email, ou vários, e deve ter programado um botão, que ao pressionado com certeza faz com que seu usuário espere por alguns instantes (indeterminado diga-se de passagem), até que ocorra a conexão com o servidor SMTP, em seguida o login, o envio da mensagem, finalmente o encerramento da sessão.  Algo como uma tela cinza e uma imagem de um circulo que fica animadamente circulando, meio sem significado se pararmos para pensar, mas que nos instiga a contar o tempo que estamos perdendo, e com certeza testando a nossa paciência e principalmente a do usuário.

2) Situação 2: Levou um certo tempo pra programar, tendo em vista que foram incluídos muitos dados estatísticos importantes, vários cálculos, agrupamento de informações, ou seja, um relatório que, em algumas situações, podem levar minutos para ser concluído.  Já ouvi falar de relatório de 3 horas, mas sinceramente, nunca enfrentei um monstro desses. E novamente, um botão que chama esse relatório, e novamente a tela cinza retorna feliz para nos brindar com o circulozinho alegre. Nesse momento lá vai o nosso usuário cortar as unhas, algumas mais afoitas iniciam uma animada rodinha pra falar dos novos sapatos, do namorado da vizinha, do Palmeiras que ta uma lástima, e por ai vai.

O culpado! Call e Udp, que são métodos de chamada que são os vilões da interrupção do fluxo de processamento, que faz chamadas de forma que o objeto chamador tenha que aguardar até o retorno do processamento.

Submit
Segundo a própria documentação, até a versão do Gx7.0, esse comando executava chamadas a processos AS400 de forma síncrona, a partir da 7.5 passou a ser disponibilizado para Web para executar processos assíncronos, ou seja, processos executados de forma paralela.

Em outras palavras, o comando permite gerar um novo processo em execução no servidor, de forma paralela ao atual, e o melhor é que o atual não aguarda o retorno da execução do processo em paralelo. O que resolveria de forma elegante nossas duas situações, ou seja, dispararíamos o processo para enviar o email ou gerar o relatório e o usuário ficaria confortavelmente na tela de seu sistema, continuando sua operação normalmente.

Claro que isso exigiria um pouco de Engenharia para informar ao usuário que seu relatório foi gerado, que o email foi enviado, mas isso é tema para outra história interessante.

Na Sintaxe o Segredo
Sinistro isso, pois o submit exige uma sintaxe meio esquisita, mas tem explicação.  Em seguida ao nome do processo a ser disparado segue-se um '' cujo significado seria a passagem de parâmetros de segurança (usuário/senha), mas que na chamada a uma procedure não teria funcionalidade.

 
      1) submit('sendmail','',&email)

      2) sendmail.submit('',&email)

O submit aceita parâmetros assim como quaisquer chamada Call ou Udp.

Quanto à procedure, apesar da documentação exigir um Main Program e o protocolo de chamada  do tipo Command Line, em meus testes no EV2, .Net, Web, não houve necessidade de nada disso.  Qualquer procedure funciona. Em um WebPanel ocorre a chamada ao objeto mas na mesma janela que a atual, portanto, não causa muito efeito.

Conclusão
Na minha humilde visão (miope) acredito que esse recurso seja uma excelente solução para reduzir o impacto de processos lentos na interface do usuário, pois permite a possibildade de execução em paralelo.  No caso do email cheguei a criar uma kb de gerenciamento de envio de emails, chamada com webservices para resolver o problema da espera, ficou muito interessante, gerenciável, mas analisando bem, uma palavrinha só seria necessária para acabar com o problema: submit. E não é isso que buscamos? simplicidade?


Para saber mais:
• http://www.gxtechnical.com/gxdl/pub/genexus/devenv/docum/releasenotes/7.5/submit.htm
• http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Submit+Command,