Duvida - esperar mudar status para continuar metodo
4 respostas
I
izaura
Olá Pessoal!
Tenho um metodo que executa um JOB no SQL. No primeiro momento o resultset retorna o campo status = 1 … após o JOB ser executado o status vira 4 (status = 4) , como faço para continuar o metodo somente quando o status for 4?
class X implements Runnable {
public void run() {
// Chama a job
int status = 1;
while(status != 4) {
// Pega o status novamente
if(status != 4) { // Se o status nao for 4
Thread.sleep(5000); // aguarda por cinco segundos
}
}
// Continua após o status ser 4
}
I
izaura
Valeu lsjunior!
Estou seguindo sua orientação … daqui a pouco posto o resultado.
Obrigada!
ViniGodoy
A variável status não pode ser local;
É melhor usar wait/notify do que sleep;
Você precisa usar a variável status num contexto sincronizado (ou declara-la como volatile);
Seria uma boa criar constantes para esses valores status. Ou usar um enum.
No resto a lógica é aquela mesmo.
publicsynchronizedvoidtrocarStatus(){
status=4;notify(); //Avisa que o status mudou
}
publicsynchronizedvoidmetodoQueEspera(){
while(status!=4){
wait(); //Espera até que um notify seja dado}
}
I
izaura
Ola ViniGodoy!
Veja um pedaço do código:
try{stJobStarted.execute("exec msdb.dbo.sp_help_job @job_name = '"+jobName+"', @execution_status = 1");ResultSetrs2=stJobStarted.getResultSet();if(rs2.next()){if((rs2.getInt("current_execution_status")==1)){facesMessages.add(Severity.INFO,"JOB em execução - aguarde!");/*while (rs2.getInt("current_execution_status") != 4) { // Pega o status novamente if (rs2.getInt("current_execution_status") != 4) { // Se o status nao for 4 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // aguarda por cinco segundos } // Continua após o status ser 4 System.out.println("status: " + rs2.getInt("current_execution_status")); } */}elseif((rs2.getInt("current_execution_status")==4)&&(rs2.getInt("last_run_outcome")==1)){isJobStart=true;}else{facesMessages.add(Severity.INFO,"Não foi possível iniciar a Sincronização - JOB problema.");}}else{facesMessages.add(Severity.INFO,"Não foi possível iniciar a Sincronização - JOB problema.");}}catch(SQLExceptione){e.printStackTrace();}finally{if(stJobStarted!=null){stJobStarted.close();}}
Se cair no segunfo If (linha8 - (rs2.getInt("current_execution_status") == 1)) , tenho q esperar mudar o status para 4, para poder prosseguir.