4 Stimmen

Über FutureTask, finally und TimeoutExceptions in Java

Ich versuche zu verstehen, wie man sicherstellen kann, dass eine bestimmte Aktion in einer bestimmten Zeitspanne abgeschlossen wird. Es scheint eine einfache Aufgabe für die neue util.concurrent-Bibliothek von Java zu sein. Allerdings beansprucht diese Aufgabe eine Verbindung zur Datenbank, und ich möchte sicher sein, dass sie diese Verbindung bei Zeitüberschreitung ordnungsgemäß freigibt.

um den Dienst anzurufen:

int resultCount = -1;
ExecutorService executor = null;
try {
 executor = Executors.newSingleThreadExecutor();
 FutureTask<Integer> task = new CopyTask<Integer>();
 executor.execute(task);
 try {
  resultCount = task.get(2, TimeUnit.MINUTES);
 } catch (Exception e) {
   LOGGER.fatal("Migrate Events job crashed.", e);
   task.cancel(true);
   return;
 }
} finally {
if (executor != null) {
 executor.shutdown();
}

Die Aufgabe selbst umhüllt einfach eine Callable, hier ist die Aufrufmethode:

@Override
public Integer call() throws Exception {
 Session session = null;
 try {
  session = getSession();
  ... execute sql against sesssion ...
  }
 } finally {
  if (session != null) {
   session.release();
  }
 }
}

Meine Frage an diejenigen, die es bis hierher geschafft haben, lautet also: Ist session.release() dazu bestimmt, aufgerufen zu werden, wenn die Aufgabe aufgrund einer TimeoutException fehlschlägt? Ich vermute, dass dies nicht der Fall ist, aber ich würde mich freuen, wenn ich eines Besseren belehrt werde.

感謝

bearbeiten : Das Problem, das ich habe, ist, dass gelegentlich die Sql in Frage nicht aufgrund von wierd db Probleme beendet wird. Also, was ich tun möchte, ist einfach die Verbindung zu schließen, lassen Sie die DB Rollback die Transaktion, erhalten einige Ruhe und versuchen Sie dies zu einem späteren Zeitpunkt. Ich behandle get(...) also so, als würde ich den Thread beenden. Ist das falsch?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X