| On shutdown DefaultJobExecutor.dispose calls shutdownNow() without waiting, and a job status is only persisted when the job finishes. A long job (space move, extension upgrade) interrupted by a container stop ends half done, with no stored status and nothing to show to the user. Proposal: a job.shutdownTimeout property; dispose waits up to that long, then cancels and interrupts; an interrupted job is stored as canceled with its error; the job status store flushes its asynchronous writes before the component manager disposes the stores. |