Hallo Community,
ich habe einen Workflow entwickelt in dem ein Modul einen Auftrag zum Deployen ausführt. Um zu vermeiden, dass mehrere Benutzer den Auftrag gleichzeitig ausführen, hatte ich zunächst einen Service entwickelt, der einen Lock aus dem JDK verwendet. Diese hat allerdings nicht funktioniert, da trotz Kapselung als statisches Objekt per Singelten für jeden Zugriff ein neues Objekt erzeugt wurde.
Als Workaroud habe ich dann den lock des ScheduleEntry verwendet und so eine Warteschleife entworfen. Das hatte auch prima funktioniert, nur ist es leider so, dass nur ein Administator den ScheduleEntry locken kann. Da normale Editoren den Workflow ebenso ausführen sollen können, ist diese Lösung ein schlecht. Hat jemand einen besseren Vorschlag, wie ich den Auftrag sperren und die Warteliste anpassen kann? Gibt es einen System weiten Lock-Mechanismus den ich dazu verwenden kann?
Aktuell sieht mein Code in etwa so aus:
public void run() {
List<ScheduleEntry> allScheduleEntries;
ScheduleEntry scheduleEntry = null;
try {
allScheduleEntries = scheduleStorage.getScheduleEntries(proj);
} catch (Exception e) {
e.printStackTrace();
return;
}
for (ScheduleEntry entry : allScheduleEntries) {
if (entry.getName().equalsIgnoreCase(schedulename)) {
scheduleEntry = entry;
break;
}
}
if (scheduleEntry == null) {
warn("The ScheduleEntry '" + schedulename + "' does not exist!", this);
return;
}
long extitTime = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS);
while (!scheduleEntry.isLocked() && System.currentTimeMillis() < extitTime) {
try {
scheduleEntry.lock();
} catch (Exception e) {
Thread.sleep(1000);
}
}
...
scheduleEntry.unLock();
}
Gruß und Dank
Frank