This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch backport/27565-to-camel-4.22.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1d5d6fbf7fea49df751866c0a0dd1747d400d897 Author: Guillaume Nodet <[email protected]> AuthorDate: Thu Oct 8 13:08:09 2026 +0000 [backport camel-4.22.x] CAMEL-25427: camel-support - on-demand route reload no longer fails after a route file is removed --- .../camel/support/RouteWatcherReloadStrategy.java | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java index 8a1d09885194..564a5c2b61cd 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java @@ -262,8 +262,8 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg // last update failed, so we need to update all previous sources to ensure we go back // to the last working set previousSources.forEach(rs -> { - // remember all the sources of the current routes (except the updated) - if (rs != null && !equalResourceLocation(resources, rs)) { + // remember all the sources of the current routes (except the updated, and those whose file is gone) + if (rs != null && !isDeletedFile(rs) && !equalResourceLocation(resources, rs)) { sources.add(rs); } }); @@ -273,9 +273,11 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg // should all existing routes be stopped and removed first? if (removeAllRoutes) { // remember all the sources of the current routes (except the updated) + // (the file of a route may have been removed since it loaded: on-demand reload only passes the files + // that exist, so its routes are removed like those of a changed file, CAMEL-25427) getCamelContext().getRoutes().forEach(r -> { Resource rs = r.getSourceResource(); - if (rs != null && !equalResourceLocation(resources, rs)) { + if (rs != null && !isDeletedFile(rs) && !equalResourceLocation(resources, rs)) { sources.add(rs); } }); @@ -389,6 +391,18 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg } } + /** + * Whether the resource is a file that no longer exists. Only the location is looked at: a source restored from its + * last loaded content is kept in memory and always exists, but its file may have been removed since (CAMEL-25427). + */ + private static boolean isDeletedFile(Resource resource) { + String loc = resource.getLocation(); + if (loc == null || !loc.startsWith("file:")) { + return false; + } + return !Files.exists(Paths.get(loc.substring(5))); + } + /** * Whether the target is loading any of the given sources */
