que diferença entre a taxa fixa e o atraso fixo na primavera do calendário?

estou a implementar tarefas agendadas usando a mola e vejo que tenho 2 tipos de tempo de configuração que funciona novamente a partir do mais recente. Que diferença entre 2 tipos esta configuração.

 @Scheduled(fixedDelay = 5000)
    public void doJobDelay() {
        // do anything
    }
  @Scheduled(fixedRate = 5000)
    public void doJobRate() {
        // do anything
    }
Author: Adam, 2016-08-09

5 answers

  • taxa fixa: faz com que a Primavera execute a tarefa em intervalos periódicos, mesmo que a a última invocação ainda pode estar em execução.
  • fixedDelay: controla especificamente o tempo de execução seguinte quando o a última execução terminou.

Em código:

@Scheduled(fixedDelay=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated once only the last updated finished ");
    /**
     * add your scheduled job logic here
     */
}


@Scheduled(fixedRate=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated every 5 seconds from prior updated has stared, regardless it is finished or not");
    /**
     * add your scheduled job logic here
     */
}
 18
Author: kuhajeyan, 2018-03-19 16:05:02

FixedRate: é usado para executar o método de trabalho em cada n milisegundos. Não importa se o trabalho já terminou a sua tarefa anterior.

FixedDelay: é usado para executar o método de trabalho sequencialmente com o tempo de espera de N milisegundos dado entre as tarefas.

Quando utilizar "fixedrato": fixedRate é apropriado se não for esperado exceder o tamanho da memória e do conjunto de fios. Se as tarefas recebidas não terminarem rápido, pode acabar com "excepção de Memória"

Quando utilizar "fixedDelay": Se todas as tarefas em execução forem relevantes umas para as outras e tiverem de esperar antes de terminar a anterior, fixedRate é adequada. Se o tempo do fixedDelay for definido com cuidado, também irá permitir que os tópicos em execução tenham tempo suficiente para terminar as suas tarefas antes do início da nova tarefa

 7
Author: ahmetcetin, 2017-07-25 16:46:26

"taxa fixa": espera por X Milis desde o início da execução anterior antes de iniciar a próxima execução. Se a execução corrente exceder o intervalo 'fixedRate', a execução seguinte é em fila de espera, mas apenas a próxima. Não criará uma série de execuções em fila de espera

private static int i = 0;

@Scheduled(initialDelay=1000, fixedRate=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

resultado:

Iniciado: 1
Terminado: 1 / / após 4 segundos
Iniciado: 2/ / w / o imediatamente à espera de 1 segundo, conforme especificado na taxa fixa
Terminado: 2 / / Após 4 segundos
e assim por diante

"fixedDelay": espera por X millis do final da execução anterior antes de iniciar a próxima execução. Não importa quanto tempo a execução atual está tomando, a próxima execução é iniciada depois de adicionar o intervalo 'fixedDelay' para a hora final da execução atual. Ele não vai fazer fila na próxima execução.

private static int i = 0;

@Scheduled(initialDelay=1000, fixedDelay=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

resultado:

Iniciado: 1
Terminado: 1 / / após 4 segundos iniciados : 2 / / espera por 1 segundo, conforme especificado em fixedDelay Terminado: 2 / / Após 4 segundos Iniciado: 3 / / após 1 segundo
e assim por diante

 6
Author: nikhil7610, 2018-04-12 10:08:12

Atraso fixo : controla especificamente o próximo tempo de execução quando a última execução terminar.

Taxa fixa: faz com que a Primavera execute a tarefa em intervalos periódicos, mesmo que a última invocação ainda esteja em execução.

 0
Author: Jinen Kothari, 2016-08-09 06:25:56

Uma coisa que deve ser esclarecida é que fixedRate não significa que as execuções comecem com um certo intervalo de tempo.

Se um custo de execução for demasiado tempo (mais do que a taxa fixa), a execução seguinte só começará depois de o anterior terminar, a menos que @Async e @EnableAsync sejam fornecidos. Os seguintes códigos-fonte que fazem parte da implementação da Primavera ThreadPoolTaskScheduler explicam porquê:

@Override
public void run() {
    Date actualExecutionTime = new Date();
    super.run();
    Date completionTime = new Date();
    synchronized (this.triggerContextMonitor) {
        this.triggerContext.update(this.scheduledExecutionTime, actualExecutionTime, completionTime);
        if (!this.currentFuture.isCancelled()) {
            schedule();
        }
    }
}

Você pode ver que só depois da tarefa anterior estar terminada (super.run()), a próxima tarefa está agendada (schedule()). Com @Async e @EnableAsync, super.run() é uma função async que retornará imediatamente, portanto a próxima tarefa não tem que esperar que a anterior realmente termine.

 0
Author: fifman, 2018-04-04 08:37:42