<div>use strict;</div><div>use warnings;</div><div>use DBI;</div><div>use Asterisk::AMI;</div><div>use POSIX qw/strftime/;</div><div><br></div><div>$|=1;</div><div><br></div><div>print "Iniciando...\n";</div><div>
print "[" . strftime('%d-%m-%Y %H:%M:%S', localtime) . "] PID: $$\n";</div><div><br></div><div>...</div><div>eval {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>our $connDB = DBI->connect('DBI:mysql:ast_tm;host=bd07.internal.dc', '***********', '************') || </div>
<div>              die "Nao foi possivel conectar na base de dados: $DBI::errstr";</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">       </span>our $selTM = $connDB->prepare("SELECT ID_Lote, ID_Lote_TM, Numero, Texto, FlgConfirmacao, FlgStatus_Lote, FlgStatus_TM FROM vw_TM_Pendente WHERE (Prioridade > 6) LIMIT 100");</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>our $updTMc = $connDB->prepare("UPDATE MOV_Lote SET FlgStatus=? WHERE ID=?");</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>our $updTMi = $connDB->prepare("UPDATE MOV_Lote_TM SET FlgStatus=?, DtHrEnvio=?, OutChannel=? WHERE ID=?");</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>our $insTMl = $connDB->prepare("INSERT INTO LOG_TM_Main (ID_Lote, DtHrEvento, FlgStatus, Status) VALUES (?, ?, ?, ?)");</div><div><br></div><div>
...</div><div><br></div><div>        $insTMl->execute($ID_Lote, strftime('%Y-%m-%d %H:%M:%S', localtime), 13, $Status);</div><div><br></div><div>...</div><div>}</div><div>if ($@) {</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>$Log($@);</div>
<div><br></div><div># Verifica qual foi o erro, se foi na conexão, conecta em outro server. Se foi no insert, executa uma rotina de atualização da chave, etc.</div><div>...</div><div>}</div><div><br></div><div>our $AMI = Asterisk::AMI->new(PeerAddr => 'pbx16.internal.dc',</div>
<div>                              PeerPort => '5038',</div><div>                              Username => '*******',</div><div>                              Secret => '********'</div><div>
                             ) || die "Nao foi possivel conectar no Asterisk!";</div><div>...</div><div><br></div><div>   eval {</div><div><br></div><div>      my $actid = $AMI->send_action({   ...</div><div>
                                    });</div><div><br></div><div>      my $respact = $AMI->get_response($actid);</div><div><br></div><div>...</div><div><br></div><div>      $chnResponse = $respact->{'Response'};</div>
<div>      $chnMessage = $respact->{'Message'};</div><div>      $chnChannel = $respact->{'PARSED'}->{'Channel'};</div><div><br></div><div>...      </div><div>   };</div><div><br></div><div>
   if (($@) || ($chnResponse eq "Error")) {</div><div><br></div><div>...</div><div>      </div><div>      return 0;</div><div>   }</div><div>   else {</div><div>...</div><div>   </div><div>      return 1;</div><div>
   }</div><div><br></div><div><br></div><div>Esse ai é um pedaço de um dos programas, por questões contratuais eu não posso postar o código.</div><div><br></div><div>No primeiro "eval" quando ocorre erro de conexão ele na aborta o programa, mais quando ocorre erro no insert, aborta. Tem algumas outras instruções ali, como manipulação de data/hora e abertura de arquivos texto. Algumas não abortam e são tratadas logo abaixo, outras abortam, principalmente os erros evolvendo os arquivos texto.</div>
<div><br></div><div>No segundo "eval", quando o {'channel'} não vem aborta, ou quando a conexão com o Asterisk caiu e eu tento executar o send_action. Ou outros erros não abortam.</div><div><br></div><div>
Precisava de uma forma que nenhum erro abortasse para poder trata-los ou pelo menos gravar log.</div><div><br></div>[...]'s<br><br>Marcio