Tengo una aplicación que cada 15 minutos más o menos realiza una replicación desde una base de datos remota. Simplemente mantiene los dos repositorios sincronizados. Una vez que se lleva a cabo esta replicación, no es posible volver a hacerlo. He configurado la siguiente estructura, pero no estoy seguro de si es el enfoque correcto.Cómo bloquear un método java para proteger múltiples invocaciones
public class ReplicatorRunner {
private static Lock lock = new ReentrantLock();
public replicate() {
if (lock.tryLock()) {
try {
// long running process
} catch (Exception e) {
} finally {
lock.unlock();
}
} else {
throw new IllegalStateException("already replicating");
}
}
}
public class ReplicatorRunnerInvocator {
public void someMethod() {
try {
ReplicatorRunner replicator = new ReplicatorRunner();
replicator.replicate();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
El ReplicatorRunner
es la clase propietaria del método replicate
que sólo se puede ejecutar uno a la vez.
Editar. Necesito que la siguiente llamada falle (no bloque) si el método ya se está ejecutando en cualquier instancia.
¿Hay una pregunta aquí en alguna parte? – shoosh
Yeap, en el título ... amigo, no tengo tiempo para ayudarte totalmente, pero verifica la palabra clave sincronizada ... –
La sincronizada está en una instancia por instancia o por clase (si es estática) y bloques. Quiero que falle y no bloquear. – rmarimon