Duvida - esperar mudar status para continuar metodo

4 respostas
I

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?

Agradeço desde já!

4 Respostas

L

Acho que usando Threads vc terá o que precisa.

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

Valeu lsjunior!

Estou seguindo sua orientação … daqui a pouco posto o resultado.

Obrigada!

ViniGodoy
  1. A variável status não pode ser local;
  2. É melhor usar wait/notify do que sleep;
  3. Você precisa usar a variável status num contexto sincronizado (ou declara-la como volatile);
  4. Seria uma boa criar constantes para esses valores status. Ou usar um enum.

No resto a lógica é aquela mesmo.

public synchronized void trocarStatus() {
   status = 4;
   notify(); //Avisa que o status mudou
}

public synchronized void metodoQueEspera() {
   while (status != 4) {
      wait(); //Espera até que um notify seja dado
   }
}
I

Ola ViniGodoy!

Veja um pedaço do código:

try {			
			stJobStarted.execute("exec msdb.dbo.sp_help_job @job_name = '" + jobName + "', @execution_status = 1");
			
			ResultSet rs2 = 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"));
					    }  */
					
					
				} else if ((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 (SQLException e) {
			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.

Desde já agradeço!

Criado 5 de novembro de 2010
Ultima resposta 5 de nov. de 2010
Respostas 4
Participantes 3