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.