quarkusio/quarkus · warning · RuntimeException
java.lang.InterruptedException (wrapped)
Error message
java.lang.InterruptedException (wrapped)
What it means
RuntimeUpdatesProcessor.handleChanges(), when running in test mode, sleeps 500ms before periodic test compilation; if that Thread.sleep is interrupted, the InterruptedException is wrapped in a RuntimeException and rethrown. The interruption typically comes from dev mode shutting down while change handling is in flight, so this is usually a benign shutdown-time failure.
Source
Thrown at core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java:253
if (IS_LINUX) {
//note that this is only used for notifications that something has changed,
//this triggers the same file scan as the polling approach
//this is not as efficient as it could be, but saves having two separate code paths
testClassChangeWatcher = new WatchServiceFileSystemWatcher("Quarkus Test Watcher", true);
FileChangeCallback callback = new FileChangeCallback() {
@Override
public void handleChanges(Collection<FileChangeEvent> changes) {
//sometimes changes come through as two events
//which can cause problems for our CI tests
//and cause unnecessary runs.
//we add a half second delay for CI tests, to make sure this does not cause
//problems
try {
if (context.isTest()) {
Thread.sleep(500);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
periodicTestCompile();
}
};
// monitor .env as it can impact test execution
testClassChangeWatcher.watchFiles(Path.of(context.getApplicationRoot().getProjectDirectory()),
List.of(Path.of(".env")),
callback);
Set<Path> nonExistent = new HashSet<>();
for (DevModeContext.ModuleInfo module : context.getAllModules()) {
for (Path path : module.getMain().getSourcePaths()) {
testClassChangeWatcher.watchDirectoryRecursively(path, callback);
}
for (Path path : module.getMain().getResourcePaths()) {
testClassChangeWatcher.watchDirectoryRecursively(path, callback);
}
}
for (DevModeContext.ModuleInfo module : context.getAllModules()) {View on GitHub (pinned to e1c734241f)
Solutions
- Usually ignore: it occurs during shutdown and does not affect a fresh dev mode run.
- If it appears repeatedly at runtime, check which component interrupts the update thread (e.g. executor shutdown) and ensure change watchers are stopped before shutdown.
- Upgrade Quarkus — later releases handle interruption in the update loop more gracefully.
- Reproduce context: note whether it coincides with test completion; adjust quarkus.test.continuous-testing settings if disruptive.
Example fix
// before (framework behavior on shutdown) Thread.sleep(500); // InterruptedException -> RuntimeException // after (user-side): nothing to change in app code; restart dev mode cleanly ./mvnw quarkus:dev
Defensive patterns
Strategy: try-catch
Try / catch
try {
// change handling / shutdown
} catch (RuntimeException e) {
if (e.getCause() instanceof InterruptedException) {
Thread.currentThread().interrupt(); // expected during shutdown; treat as benign
}
} Prevention
- Expect this during dev mode shutdown; verify against a fresh restart rather than debugging in-place.
- Keep Quarkus updated for improved interruption handling in the update loop.
- Avoid force-killing the dev process while continuous testing is recompiling.
When it happens
Trigger: Dev mode / continuous testing stops (application shutdown, watcher thread interrupted) at the exact moment handleChanges is sleeping before periodicTestCompile(); the InterruptedException is converted to a RuntimeException.
Common situations: Stopping quarkus:dev (Ctrl+C) while continuous testing is mid-recompile; test run finished and the update processor being torn down during a change event.
Related errors
- Either location or predicate must be set
- Predicate already set
- Location already set
- Hot deployment of the application is not supported when upda
- errorMessage
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/491fb284efc661d1.
Report an issue: GitHub.