Pesquisar neste blog

quinta-feira, 21 de outubro de 2010

64 Bits c/ GX .. solução ou só mais dor de cabeça ???

Tinhamos um código em GX 9 (.net WIN ) que funcionava muito bem no nosso cliente..

Vejam abaixo:

&vrMailMessage.To.New( &NomeSacado, &EnderecoEmail )        
&vrMailMessage.From.Address = 'XYZ@ABC.ORG.BR'

 &vrMailMessage.From.Name = 'CLIENTE DE EMAIL'
 &vrMailMessage.CC.New( 'NOME CLIENTE', 'email@cliente.com.br')  
&vrMailMessage.Subject = 'Envio de E-mail de Boleto do Depto'  
&vrMailMessage.HTMLText = &BoletoHtml

    &vrSMTP.Timeout         = 5000
    &vrSMTP.Host            = CON_PARAMETROS.PAR_HOST_EMAIL
    &vrSMTP.Sender.Name     = 'Depto'
    &vrSMTP.Sender.Address  = ' XYZ@ABC.ORG.BR’   
    &vrSMTP.Authentication  = 1  
    &vrSMTP.UserName        =  CON_PARAMETROS.PAR_USER_EMAIL
    &vrSMTP.Password        =  CON_PARAMETROS.PAR_USER_PASSWORD_EMAIL
    Msg('Aguardando logon do servidor : SMTP.HOST.COM.BR , aguarde...Timeout(' + &vrSMTP.Timeout.ToString() + ')' , status)
    &vrSMTP.Login()   
    If &vrSMTP.ErrCode = 0
        &vrSMTP.Send(&vrMailMessage)
        If &vrSMTP.ErrCode = 0
            Msg('Email enviando para: ' + &EnderecoEmail + ' com sucesso!')
        Else
            Msg(&vrSMTP.ErrDescription)
        Endif
    Else
        Msg(&vrSMTP.ErrDescription)
    Endif
   &vrSMTP.Logout()

Funcionava muito bem.. até a uns 15 dias atrás.. que o cliente (usuário) começou a NOS pressionar reclamando de travamento na máquina. Fiz o teste em OUTRAS máquinas OK, tudo funcionando muito bem até que descobrimos que num belo dia trocaram a máquina do cliente para um 64 BITS e não nos avisaram.

Adivinhem o que aconteceu ???

O envio de email começou a travar somente nesta máquina 64 bits.. apesar de estar com o WIN XP 32.. Desativamos o firewall, desativamos o anti-virus. Mas travar o que ??. devem estar curiosos ..

Durante o envio do e-mail  via datatype SMTPsession.. é que estava travando , mesmo configurando o timeout  na propriedade do SMTPSession?? pau do Timeout só  a Artech e o suporte deverá me responder.

E ai .. o que responder ao cliente.. procura daqui , reza dali, consulta os universitários, GOOGLE do desespero, até que achamos algo parecido no WEB SAC da artech.

csharp try
csharp {
csharp string SMTPUserName = [!&NomeSacado!];
csharp string EMailTo = [!&EnderecoEmail!];
csharp string EMailSubject = "Envio de E-mail de Boleto do Depto ";
csharp string EMailMessage = [!&BoletoHtml!];
csharp string SMTPHost = "host.smtp.com.br";
csharp int SMTPPort = 25;
csharp string SMTPEmailPassword = "senha";
csharp System.Net.Mail.MailMessage mM = new System.Net.Mail.MailMessage();
csharp mM.From = new System.Net.Mail.MailAddress("email@envio.com.br");
csharp mM.To.Add(EMailTo);
csharp mM.Subject = EMailSubject;
csharp mM.Body = EMailMessage;
csharp mM.IsBodyHtml = true;
csharp mM.Priority = System.Net.Mail.MailPriority.High;
csharp System.Net.Mail.SmtpClient sC = new System.Net.Mail.SmtpClient(SMTPHost, SMTPPort);
csharp sC.EnableSsl = false;
csharp sC.Timeout = 5000;
csharp string strId;
csharp string strPassword;
csharp strId = "email@envio.com.br";
csharp strPassword = SMTPEmailPassword;
csharp sC.UseDefaultCredentials = false;
csharp sC.Credentials = new System.Net.NetworkCredential(strId, strPassword);
csharp sC.Send(mM);
csharp [!&statusEnvio!] = 1;
csharp }
csharp catch (System.Exception ex)
csharp {
csharp [!&statusEnvio!] = 0;
csharp [!&ErroDescricao!] = ex.Message;
csharp }

    If &statusEnvio = 1
        Msg('Mensagem enviada c/ sucesso pelo servidor smtp.host.com.br : (' + &statusEnvio.ToString() + ')')
    Else
        Msg('Mensagem não enviada p/ servidor smtp.host.com.br : (' + &statusEnvio.ToString() + ')')
        Msg(&ErroDescricao.Trim())
    Endif

Bingo . funcionou .. corretamente, dor de cabeça, c/os “;” no final das tags do csharp, entender o que cada  instrução faz e como interage no GX.

Este problema/solução está reportado  no SAC 28.830 , e será consertado somente no GX EVL UPGRADE 4.

Restou a nós uma conclusão ou exagero, PAU no Timeout(motivo do travamento) dos comandos(smtpSession) do GX ??? ou Pau nos comandos do GX 64 BITS ??  pois este problema não aconteceu nas outras máquinas (WIN XP 32 BITS, e WIN 2003) ???

Até quando vamos precisar apelar a linguagem(nativa) para resolvermos nosso problemas urgentíssimos ???

E os mesmos problemas recentes do GX  9.0 em 64 bits se repetirão no GX X EVL 1 ou EVL 2 ??? E na hora de utilizarmos linguagens mais recentes ??? Ruby apelaremos para quem ??  o Santo Darma Ruby ?? existe ?? no Japão ???

E oura coisa.. o código csharp gerado manualmente pelas tags CSHARP estão impossíveis de serem entendidos .. vejam abaixo:

            /* User Code */
            Boleto.CidadeSacado = AV54Cidade.Trim();
            /* User Code */
            Boleto.EstadoSacado = AV24Estado.Trim();
            /* User Code */
            Boleto.CepSacado = AV25CepSac.Trim();
            AV6Hoje = DateTimeUtil.DToC( DateTimeUtil.Today( ), 4, "/") ;
            /* User Code */
            Boleto.DataDocumento = AV6Hoje;
            AV7Vencime = DateTimeUtil.DToC( AV30Vencim, 4, "/") ;
            /* User Code */
            Boleto.DataVencimento = AV7Vencime.Trim();
            /* User Code */
            Boleto.NumeroDocumento = AV26Numero.Trim();
            /* User Code */
            Boleto.ValorDocumento = (double)AV27ValorD;
            /* User Code */
            Boleto.PercentualJurosDiaAtraso = (double)AV32Empres;
            /* User Code */
            Boleto.PercentualMultaAtraso = (double)AV33Empres;
            /* User Code */
            Boleto.PercentualDesconto = (double)AV34Empres;
            /* User Code */
            Boleto.DiasProtesto = AV35Empres;
            /* User Code */
            Boleto.PadroesBoleto.Demonstrativo = AV28Demons.Trim();

O código acima não ficaria mais fácil de entender se fosse conforme o código abaixo??( tudo bem que o código abaixo é em GX 9, talvez em GX X/EVL esteja melhor)

            /* User Code */
            Boleto.CidadeSacado = AV54Cidade.Trim();
            Boleto.EstadoSacado = AV24Estado.Trim();
            Boleto.CepSacado = AV25CepSac.Trim();
            AV6Hoje = DateTimeUtil.DToC( DateTimeUtil.Today( ), 4, "/") ;
            Boleto.DataDocumento = AV6Hoje;
            AV7Vencime = DateTimeUtil.DToC( AV30Vencim, 4, "/") ;
            Boleto.DataVencimento = AV7Vencime.Trim();
            Boleto.NumeroDocumento = AV26Numero.Trim();
            Boleto.ValorDocumento = (double)AV27ValorD;
            Boleto.PercentualJurosDiaAtraso = (double)AV32Empres;              
Boleto.PercentualMultaAtraso = (double)AV33Empres;
            Boleto.PercentualDesconto = (double)AV34Empres;
            Boleto.DiasProtesto = AV35Empres;
            Boleto.PadroesBoleto.Demonstrativo = AV28Demons.Trim();
            /* User Code */

Ou .. se  o código abaixo

csharp string EMailSubject = "Envio de E-mail do Depto ";
csharp string EMailMessage = [!&BoletoHtml!];
csharp string SMTPHost = "host.de.envio";
csharp int SMTPPort = 25;
csharp string SMTPEmailPassword = "senha";

não poderia ser escrito assim e GX ?

CSHARP{
string EMailSubject = "Envio de E-mail do Depto ";
string EMailMessage = [!&BoletoHtml!];
string SMTPHost = "host.de.envio";
int SMTPPort = 25;
string SMTPEmailPassword = "senha";


Vai aqui nossa modesta experiência em geradores:
  1. Gerar código comentando linha a linha ajuda e muito a manutenção / debug por parte dos desenvolvedores;
  2. E o  principal;  a geração(sobreposição) de código nativo(feito pelo programador) sobre o código gerado pelo GX deveria ser respeitado e de responsabilidade do analista/desenvolvedor a qualquer momento e em qualquer situação.

Querem ver um exemplo clásico .. os códigos fontes gerados pelas principais classes do GX GXCommon, GXMail, GXDbi32, GXOffice, e pelo GXGeral .js deveriam estar de fácil acesso a equipe de desenvolvimento  para que pudéssemos debugá-los e até alterá-los ao nosso gosto.

Claro , a Artech vai nos dizer que ai a responsabilidade de suporte dela terminaria até  alterarmos o código fonte gerado, mas  ai .. vamos responder .. aguardaríamos uma solução /debug até quando ?? a cada preview de 2 a dois meses ? até perdermos nosso contrato ??? por demora nesta solução por parte da Artech ???

Nós da área de TI, entendemos probleminhas, problemas e problemões..agora nossos clientes de diversas áreas não entendem e não gostam de esperar.

O post acima foi só para  clarear a todos (nós, Artech , suporte e desenvolvedores) a que ponto chegamos na hora dos gargalos sérios.. e como podemos resolvê-los. O GX nos permite resolver vários problemas sérios de muitas maneiras.. (partir para  a linguagem nativa é um deles.. ), mas o ideal é que  não precisássemos disto.. mas se a pressão for grande não nos restará outro caminho.

Tunning de máquina, Tunning de banco de dados , Tunning de regras de negócios .. porque não Tunning de código gerado ??? 

Somos leigos a que nível a lógica gerada(pelo GX) pode variar .. mas somos objetivos no que precisa ser revolvido... contem conosco .. nossa ajuda .. , nossas orações.. só espero nos ajudarem na hora do prejuízo e na corda do pescoço por parte do cliente.

Boa sorte a Artech , ao EVL2 e aos geradores móveis.

Abraço


Ricardo
RCO Proc. De Dados

5 comentários:

Genexando disse...

Ola Ricardo,
Tivemos o mesmo problema com o sendmail e windows 7 64bits, e a solucao foi gerar a parte de envio com uma kb em windows xp32bits. Em nosso caso nem mesmo csharp resolveu. Apóio sua ideia sobre o csharp { ... }.
Ab, :)
Douglas

Vandré Felipe de Oliveira Nicolau disse...

De fato o código aqui mostrado foi o que nos deu a solução também depois de testes em todas as plataformas de sistemas operacionais possiveis e versões diferentes de GX. Mas é importante salientar que uma grande quantidade de emails pode ainda travar no csharp portanto evitem enviar uma grande quantidade de emails de uma vez em suas aplicações

Unknown disse...

Vandré e Douglas.. bom saber disto(deste problema c/ vcs).

Agora o problema nosso foi apenas em emails unitários e esporádicos, não emails em lote.

Valeu e obrigado a todos.

Anônimo disse...

Cara, esse código salvou minha vida !
Tava com problema de envio de email na locaweb. algum recurso de segurança deles tava bloqueando a dll do genexus e a porra do email não ia de jeito nenhum !

Contornei usando esse seu código e ficou perfeito !

Muito obrigado por compartilhar !
Abraço.

Anônimo disse...

Olá Ricardo,
é bom ter uma solução alternativa em mãos, pois quando menos se espera o Gx nos deixa na mão, muitas vezes em algo que nem imaginamos que possa dar problema. Esse código c# é a mão na roda para esse problema, também passei por isso, mas a máquina não era 64 bits e quando ocorria o travamento de e-mail, toda aplicação travava.
Abraço