mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-04-06 18:20:26 +08:00
Fix task.getLastException does not receive subtasks' value
This commit is contained in:
parent
e940845c60
commit
3ae826d9ca
@ -24,6 +24,7 @@ import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
@ -64,7 +65,7 @@ public final class TaskExecutor {
|
||||
public TaskExecutor start() {
|
||||
taskListeners.forEach(TaskListener::onStart);
|
||||
workerQueue.add(scheduler.schedule(() -> {
|
||||
boolean flag = executeTasks(Collections.singleton(firstTask));
|
||||
boolean flag = executeTasks(Collections.singleton(firstTask), new AtomicReference<>());
|
||||
taskListeners.forEach(it -> it.onStop(flag, this));
|
||||
}));
|
||||
return this;
|
||||
@ -74,7 +75,7 @@ public final class TaskExecutor {
|
||||
taskListeners.forEach(TaskListener::onStart);
|
||||
AtomicBoolean flag = new AtomicBoolean(true);
|
||||
Future<?> future = scheduler.schedule(() -> {
|
||||
flag.set(executeTasks(Collections.singleton(firstTask)));
|
||||
flag.set(executeTasks(Collections.singleton(firstTask), new AtomicReference<>()));
|
||||
taskListeners.forEach(it -> it.onStop(flag.get(), this));
|
||||
});
|
||||
workerQueue.add(future);
|
||||
@ -100,7 +101,7 @@ public final class TaskExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean executeTasks(Collection<? extends Task> tasks) throws InterruptedException {
|
||||
private boolean executeTasks(Collection<? extends Task> tasks, AtomicReference<Exception> exception) throws InterruptedException {
|
||||
if (tasks.isEmpty())
|
||||
return true;
|
||||
|
||||
@ -128,6 +129,8 @@ public final class TaskExecutor {
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
exception.set(tasks.stream().map(Task::getLastException).filter(Objects::nonNull).findAny().orElse(null));
|
||||
return success.get() && !canceled;
|
||||
}
|
||||
|
||||
@ -160,9 +163,12 @@ public final class TaskExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
boolean doDependentsSucceeded = executeTasks(task.getDependents());
|
||||
if (!doDependentsSucceeded && task.isRelyingOnDependents() || canceled)
|
||||
AtomicReference<Exception> dependentsException = new AtomicReference<>();
|
||||
boolean doDependentsSucceeded = executeTasks(task.getDependents(), dependentsException);
|
||||
if (!doDependentsSucceeded && task.isRelyingOnDependents() || canceled) {
|
||||
task.setLastException(dependentsException.get());
|
||||
throw new SilentException();
|
||||
}
|
||||
|
||||
if (doDependentsSucceeded)
|
||||
task.setDependentsSucceeded();
|
||||
@ -187,9 +193,11 @@ public final class TaskExecutor {
|
||||
variables.set(taskResult.getId(), taskResult.getResult());
|
||||
}
|
||||
|
||||
boolean doDependenciesSucceeded = executeTasks(task.getDependencies());
|
||||
AtomicReference<Exception> dependenciesException = new AtomicReference<>();
|
||||
boolean doDependenciesSucceeded = executeTasks(task.getDependencies(), dependenciesException);
|
||||
if (!doDependenciesSucceeded && task.isRelyingOnDependencies()) {
|
||||
Logging.LOG.severe("Subtasks failed for " + task.getName());
|
||||
task.setLastException(dependenciesException.get());
|
||||
throw new SilentException();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user