<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