Configurei o quartz para rodar apenas 1 thread de cada vez, sendo que tenho apenas este job agendado.
Alguém saberia me dizer se conhece alguma maneira de verificar o tempo de execução de um job, e caso ele ultrapasse determinado tempo, eu possa matar o job possibilitando que o scheduler siga o fluxo?
Talvez quando for comecar a execucao se voce quandar o tempo em milisegundos em uma varivel, ai entaum depois vc pega deno o tempo e e ve a diferenca do tempo guardado no inicio da execuccao da tarefa e o tempo atual e se der o tempo de 30 minutos ou mais voce mata a tarefa
A solução que consegui foi essa.
Não tenho experiência com o quartz para saber se é a melhor maneira de fazer isso, quando vc baixa o quartz existem alguns exemplos, sendo que o exemplo 7 mostra como interromper um job.
O exemplo não atendia à minha necessidade.
No contexto que realizei este teste, ao iniciar o tomcat o scheduler é iniciado e a trigger é disparada uma vez por minuto.
No exemplo, o job para com 30 segundos de execução.
Depois disso, um novo job é executado.
Isso que eu precisava, matar um job que estivesse rodando mais que 30 minutos, liberando o espaço para que um novo job realizasse o processo.
Configurei o quartz para rodar uma thread por vez no quartz.properties e coloquei a anotação @DisallowConcurrentExecution.
Meu projeto só roda este agendamento do quartz.
@DisallowConcurrentExecution
public class TesteJob implements InterruptableJob {
private boolean interrupted = false;
private final int TIME_IN_MILLIS = 30000; //30 segundos
private void imprimirHorario() {
Date date = new Date();
DateFormat formato = new SimpleDateFormat("HH:mm:ss.SSS");
String formattedDate = formato.format(date);
System.out.println(formattedDate);
}
public void execute(JobExecutionContext arg0) throws JobExecutionException {
long init;
long now;
long tempo;
try {
Thread t = new Thread("teste") {
@Override
public void run() {
try {
while(true){
imprimirHorario();
Thread.sleep(1000);
if(interrupted){
System.out.println("*******************************************************************");
this.interrupt();
}
}
}catch(InterruptedException ie){
//log - Job interrompido
} catch (Exception e) {
e.printStackTrace();
}
}};
init = System.currentTimeMillis();
t.start();
while (!interrupted && t.isAlive()) {
try {
t.join(1000L);
now = System.currentTimeMillis();
tempo = now - init;
if(tempo > TIME_IN_MILLIS)
interrupt();
} catch (InterruptedException e) {
break;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Override
public void interrupt() throws UnableToInterruptJobException {
this.interrupted = true;
}