Método de llamada cada 30 segundos a menos que exista una fila en la tabla

Arya:

Tengo la clase después de lo cual comprueba una tabla de base de datos cada segundo para comprobar si hay filas. Si existe una fila fijaráincludeForceUpdate = true

si la tabla de base de datos no contiene ninguna fila, entonces quiero sendUpdatea ser llamado cada 30 segundos desde la última vez que fue llamado.

Si en cualquier momento una nueva fila se convierte en disponible en la tabla a continuación sendUpdatese llamará inmediatamente y los 30 segundos del temporizador se inicia desde el momento sendUpdateme llamaron.

La tabla constantemente debe hacerse exámenes para detectar nuevas filas.

No puedo envolver mi mente alrededor de hacer esto. Por qué necesito utilizar más hilos?

En términos simples, quiero que el siguiente suceda

sendUpdate debe ejecutar cada 30 segundos.

Sin embargo, si en cualquier momento hay una nueva fila en la base de datos a continuación, sendUpdatedebe ejecutar inmediatamente sin pasar por los 30 segundos esperan.

public class Updater implements Runnable {
    private volatile boolean exit = false;
    Database db = new Database();

    @Override
    public void run() {
        while (!exit) {
            Boolean includeForceUpdate = false;
            try {
                Long id = db.getUpdate(myAccountId);
                if (id != null) {
                    db.deleteForceUpdate(id);
                    sleepTime = 1;
                    includeForceUpdate = true;
                } else {
                    sleepTime = 30;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void sendUpdate(Boolean includeForceUpdate) throws Exception {
       //my code here for sending update
    }

    public void stop() {
        exit = true;
    }
}
Arya:

Terminé usando un cronómetro para la tarea

@Override
public void run() {
    Database db = new Database();
    Instant startTime = Instant.now();

    while (!exit) {
        try {
            Long id = db.getUpdate(1105349L);
            if (id != null) {
                db.deleteUpdate(id);
            }

            Instant endTime = Instant.now();
            Duration duration = Duration.between(startTime, endTime);

            System.out.println(duration.getSeconds());
            if (duration.getSeconds() >= 30 || id != null) {
                System.out.println("CALLED!");
                startTime = Instant.now();
            }

            Thread.sleep(500);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Supongo que te gusta

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