Cancelación y reprogramar el tiempo de sueño en el flujo de trabajo súper cadencia de cliente Java

Felix Mamonov:

Cómo cambiar la duración del sueño en la cadencia de flujo de trabajo basado en una señal? ¿Es una manera adecuada utilizando java cliente?

private int timeout;

@Override
@WorkflowMethod
public void sleepAndWakeUp(int sleepTimeout) {
    this.timeout = sleepTimeout;
    sleep();
    System.out.println("Woken up after " + this.timeout + " s sleep");
}

private void sleep() {
    int currentTimeout = this.timeout;
    Workflow.await(Duration.ofSeconds(this.timeout), () -> {
        boolean cancelTimer = currentTimeout != this.timeout;
        if(cancelTimer) {
            sleep();
        }
        return cancelTimer;
    });
}

@Override
@SignalMethod
public void snooze(int sleepTimeout) {
    this.timeout = sleepTimeout;
}

No he encontrado otra posibilidad de cancelar y volver a programar un temporizador de flujo de trabajo del sueño

Maxim Fateev:

Me simplificarlo a:

private long wakeupTime;

@Override
@WorkflowMethod
public void sleepAndWakeUp(int sleepTimeout) {
    this.wakeupTime = Workflow.currentTimeMillis() + sleepTimeout;
    Workflow.await(() -> Workflow.currentTimeMillis() >= wakeupTime);
}

@Override
@SignalMethod
public void snooze(int sleepTimeout) {
    // Or whatever calculation logic is.
    // For example you can calculate from the time the workflow started.
    wakeupTime = Workflow.currentTimeMillis() + sleepTimeout;
}

Asumo que se pone @WorkflowMethod y @SignalMethod sobre la aplicación sólo para el bien de este código de ejemplo, ya que pertenecen sólo a la interfaz de flujo de trabajo.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=373740&siteId=1
Recomendado
Clasificación