You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "davsclaus (via GitHub)" <gi...@apache.org> on 2026/10/14 19:06:54 UTC
[PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
davsclaus opened a new pull request, #27847:
URL: https://github.com/apache/camel/pull/27847
Fixes https://issues.apache.org/jira/browse/CAMEL-25670
With `camel run --source-dir`, dev mode watches every file under the source directory (`routesReloadPattern=*`, recursive). Routes that write data files into a folder under it therefore reload themselves. For example, a route copies samples into an `inbox` that another route consumes and moves to `done` or `archive`. The reload restarts the routes with an empty in-memory idempotent repository, so they write again, which reloads them again. In a local-model benchmark the `connect/file-processing` example reloaded every 2.0 s for as long as it ran (63 reloads in 2 minutes), and every reload processed the same files again.
## Changes
- **camel-support**:
- a part of the reload pattern that starts with `!` excludes what it matches, for example `*,!inbox/**`;
- a folder that an exclude matches as a whole (`inbox` for `!inbox/**` or `!inbox`) is not scanned at all, through a new `FileWatcherResourceReloadStrategy.isExcludedDirectory` hook;
- when five reloads in a row within 15 s were each for files under the same folder, and none of those files is a route source or a properties, Java or Groovy file, one WARN names the folder and how to leave it out (`camel run --data-dir=inbox`, or `!inbox/**` in `camel.main.routesReloadPattern`).
- **camel run**: `--data-dir=inbox,archive`, or `camel.jbang.dataDir` in the `application.properties` of the source directory. It adds those excludes in both the in-process and the separate-JVM dev mode. The option docs, the configuration metadata and its catalog copy are regenerated, and the running guide has a short section on it.
- **Built-in examples**: of the 11 that use the file component, three write into their own folder. Each now declares its data folders in `application.properties`: `file-processing` (`samples,inbox,archive`), `error-handling` (`orders,parked`) and `csv-to-json` (`inbox,outbox`). When an example runs with `--example`, dev mode only watches its route files anyway; the property matters when its folder runs with `--source-dir`.
## Tests
- `RouteWatcherReloadDataDirTest` (camel-core, 7 tests):
- every file is watched without an exclude;
- an excluded folder is not scanned, and what is written or moved in it is no change;
- `!inbox` works like `!inbox/**`;
- a file exclude (`!*.json`) leaves files out but not folders;
- the warning comes once after five reloads for one folder within 15 s, and not when the reloads are slow, are for sources, or are for different folders.
- `RunTest`: the option parses, and `sourceDirReloadPattern` trims, normalises and skips empty entries.
- The existing reload tests in camel-core still pass (31 in total with the new ones).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01STT6whBgK1AqsSsUKrnE8m
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275232356
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,114 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ AntPathMatcher matcher = new AntPathMatcher();
+ for (String part : excludes) {
+ // inbox and inbox/** match the folder itself; a file pattern such as *.json does not leave a folder out
+ if (part.equals(relative) || matcher.match(part, relative + "/_", false)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** The path of the file relative to the watched folder, with / separators, or null when it is not under it. */
+ private String relativePath(File file) {
+ String base = new File(getFolder()).getAbsolutePath();
+ String path = file.getAbsolutePath();
+ if (!path.startsWith(base)) {
+ return null;
+ }
+ String relative = path.substring(base.length()).replace('\\', '/');
+ while (relative.startsWith("/")) {
+ relative = relative.substring(1);
+ }
+ return relative;
+ }
+
+ /**
+ * Routes that write files into a folder under the watched one reload themselves: the reload restarts the routes,
+ * they write again, and that is a change again (a file copied into an inbox, moved to done or archive). When the
+ * last {@link #LOOP_RELOADS} reloads within {@link #LOOP_MILLIS} were each for files under the same folder only,
+ * and none of those files is a source of a route, a properties file or a Java or Groovy source, a WARN names the
+ * folder and how to leave it out of reloading, once per folder (CAMEL-25670).
+ *
+ * @return whether the warning was logged now
+ */
+ boolean checkReloadLoop(List<File> changed, long now) {
+ String data = dataFolder(changed);
+ if (data == null) {
+ dataReloads.clear();
+ return false;
+ }
+ dataReloads.addLast(new DataReload(now, data));
+ while (dataReloads.size() > LOOP_RELOADS) {
+ dataReloads.removeFirst();
+ }
+ long took = now - dataReloads.getFirst().time();
+ if (dataReloads.size() == LOOP_RELOADS && took <= LOOP_MILLIS
+ && dataReloads.stream().allMatch(r -> r.folder().equals(data)) && loopWarned.add(data)) {
+ LOG.warn("Routes reloaded {} times in {} seconds, each time because files under {}/ changed, which are not"
+ + " sources of the routes. If that folder holds data the routes read or write, leave it out of"
+ + " reloading: camel run --data-dir={}, or !{}/** in the reload pattern"
+ + " (camel.main.routesReloadPattern).",
+ LOOP_RELOADS, Math.max(1, Math.round(took / 1000.0)), data, data, data);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * The folder right under the watched one that holds all the changed files, when none of them is a source (a route
+ * was loaded from it, or it is a properties, Java or Groovy file), else null.
+ */
+ private String dataFolder(List<File> changed) {
+ Set<String> sources = new HashSet<>();
+ for (Route route : getCamelContext().getRoutes()) {
+ Resource rs = route.getSourceResource();
+ if (rs != null && rs.getLocation() != null) {
+ sources.add(FileUtil.stripPath(rs.getLocation()));
+ }
+ }
+ String data = null;
+ for (File file : changed) {
+ String name = file.getName();
+ if (name.endsWith(".properties") || name.endsWith(".java") || name.endsWith(".groovy")
+ || sources.contains(name)) {
+ return null;
Review Comment:
⚠️ **Correctness:** The `sources` set is built using `FileUtil.stripPath(rs.getLocation())` (filename only), and `name` in the loop is `file.getName()` (also filename only). A data file `inbox/route.yaml` sharing a filename with route source `route.yaml` would cause `sources.contains(name)` to return `true`, making `dataFolder()` return `null` and suppressing the loop warning. Consider comparing full paths rather than bare filenames.
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,114 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ AntPathMatcher matcher = new AntPathMatcher();
+ for (String part : excludes) {
Review Comment:
⚠️ **Performance:** `new AntPathMatcher()` is allocated on every `isExcludedDirectory` call, which is invoked for every directory visited during the file walk scan. The class already maintains `AntPathMatcher.INSTANCE` (a public static final field). Use that instead:
```suggestion
AntPathMatcher matcher = AntPathMatcher.INSTANCE;
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275536431
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,127 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ for (String part : excludes) {
+ // inbox and inbox/** match the folder itself; a file pattern such as *.json does not leave a folder out
+ if (part.equals(relative) || AntPathMatcher.INSTANCE.match(part, relative + "/_", false)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** The file a route was loaded from, as an absolute path, or null when it is not a file. */
+ private static Path sourcePath(Resource resource) {
+ String location = resource != null ? resource.getLocation() : null;
+ if (location == null || location.contains(":") && !location.startsWith("file:")) {
+ return null;
+ }
+ try {
+ return Paths.get(location.startsWith("file:") ? location.substring(5) : location).toAbsolutePath().normalize();
+ } catch (Exception e) {
Review Comment:
Kept on purpose. `sourcePath` only helps tell data files from route sources for the reload-loop warning, so any failure to resolve a location should mean "not a file source" and never break a reload. That includes a `SecurityException` from `toAbsolutePath()`, not only `InvalidPathException`. Thanks for the rounds; the other five points are in.
_Claude Code on behalf of @davsclaus._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275522802
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,127 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ for (String part : excludes) {
+ // inbox and inbox/** match the folder itself; a file pattern such as *.json does not leave a folder out
+ if (part.equals(relative) || AntPathMatcher.INSTANCE.match(part, relative + "/_", false)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** The file a route was loaded from, as an absolute path, or null when it is not a file. */
+ private static Path sourcePath(Resource resource) {
+ String location = resource != null ? resource.getLocation() : null;
+ if (location == null || location.contains(":") && !location.startsWith("file:")) {
+ return null;
+ }
+ try {
+ return Paths.get(location.startsWith("file:") ? location.substring(5) : location).toAbsolutePath().normalize();
+ } catch (Exception e) {
Review Comment:
💡 **Overly broad catch** — `Paths.get()` only throws `InvalidPathException` (a subtype of `IllegalArgumentException`). Catching `Exception` here silently swallows anything unexpected (e.g. a `SecurityException` from the security manager). Narrowing it is straightforward and makes the failure mode explicit:
```suggestion
try {
return Paths.get(location.startsWith("file:") ? location.substring(5) : location).toAbsolutePath().normalize();
} catch (InvalidPathException e) {
return null;
}
```
If the intent is "any path resolution failure → treat as non-file source", that's fine, but `InvalidPathException` is the only checked failure mode here.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #27847:
URL: https://github.com/apache/camel/pull/27847
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on PR #27847:
URL: https://github.com/apache/camel/pull/27847#issuecomment-6176478755
Thanks for the review. All three points are addressed in 3d9dc19eaf34:
- `--data-dir` without a source directory now prints a warning when the option is given on the command line. `camel.jbang.dataDir` from an `application.properties` does not warn, because the examples that declare their data folders also run with `camel run --example`, which runs their files, and they would warn every time.
- The shared `AntPathMatcher.INSTANCE` is used.
- Route sources are compared by full path.
_Claude Code on behalf of @davsclaus._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275411657
##########
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java:
##########
@@ -2096,6 +2103,46 @@ static void writeCamelMainRunLogConfig(Path target, String appName, String loggi
}
}
+ /**
+ * The reload pattern of dev mode with a source directory: every file under it, except the data folders
+ * (--data-dir), whose files the routes read and write: a change there is not a change of the sources, and reloading
+ * the routes for it restarts them, so they write again and reload again (CAMEL-25670).
+ */
+ /**
+ * --data-dir only changes what dev mode watches in a source directory: without one only the given files are
+ * watched, and their data folders are not, so the option has nothing to leave out. Said when it is given on the
+ * command line; camel.jbang.dataDir in an application.properties is not, as an example that declares its data
+ * folders also runs with its files (camel run --example).
+ */
Review Comment:
💡 **Two consecutive `/** */` javadoc blocks**
The first block (lines 2106–2110) describes the reload-pattern concept but is detached from any method — javac silently discards it and only attaches the second block (2111–2116) to `warnDataDirWithoutSourceDir()`. The first block belongs on `sourceDirReloadPattern()` (it describes that method's behaviour). Move it there, or merge the two blocks into one.
##########
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java:
##########
@@ -2096,6 +2103,46 @@ static void writeCamelMainRunLogConfig(Path target, String appName, String loggi
}
}
+ /**
+ * The reload pattern of dev mode with a source directory: every file under it, except the data folders
+ * (--data-dir), whose files the routes read and write: a change there is not a change of the sources, and reloading
+ * the routes for it restarts them, so they write again and reload again (CAMEL-25670).
+ */
+ /**
+ * --data-dir only changes what dev mode watches in a source directory: without one only the given files are
+ * watched, and their data folders are not, so the option has nothing to leave out. Said when it is given on the
+ * command line; camel.jbang.dataDir in an application.properties is not, as an example that declares its data
+ * folders also runs with its files (camel run --example).
+ */
+ private void warnDataDirWithoutSourceDir() {
+ if (dataDir != null && spec != null && spec.commandLine() != null
+ && spec.commandLine().getParseResult() != null
+ && spec.commandLine().getParseResult().hasMatchedOption("--data-dir")) {
+ printer().printErr("WARN: --data-dir is used with --source-dir: without a source directory dev mode only"
Review Comment:
🐛 **Bug: inverted logic in warning text**
This method is called when `sourceDir` is `null` (i.e. the user did **not** supply `--source-dir`), but the message says:
> `--data-dir is used with --source-dir`
That's the opposite of the truth. The message should read `--data-dir is used without --source-dir`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275429002
##########
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java:
##########
@@ -2096,6 +2103,46 @@ static void writeCamelMainRunLogConfig(Path target, String appName, String loggi
}
}
+ /**
+ * The reload pattern of dev mode with a source directory: every file under it, except the data folders
+ * (--data-dir), whose files the routes read and write: a change there is not a change of the sources, and reloading
+ * the routes for it restarts them, so they write again and reload again (CAMEL-25670).
+ */
+ /**
+ * --data-dir only changes what dev mode watches in a source directory: without one only the given files are
+ * watched, and their data folders are not, so the option has nothing to leave out. Said when it is given on the
+ * command line; camel.jbang.dataDir in an application.properties is not, as an example that declares its data
+ * folders also runs with its files (camel run --example).
+ */
+ private void warnDataDirWithoutSourceDir() {
+ if (dataDir != null && spec != null && spec.commandLine() != null
+ && spec.commandLine().getParseResult() != null
+ && spec.commandLine().getParseResult().hasMatchedOption("--data-dir")) {
+ printer().printErr("WARN: --data-dir is used with --source-dir: without a source directory dev mode only"
Review Comment:
Fair, the wording was ambiguous. In 46311f0bca14 it reads: `WARN: --data-dir=inbox has no effect without --source-dir: dev mode then only watches the given files`.
_Claude Code on behalf of @davsclaus._
##########
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java:
##########
@@ -2096,6 +2103,46 @@ static void writeCamelMainRunLogConfig(Path target, String appName, String loggi
}
}
+ /**
+ * The reload pattern of dev mode with a source directory: every file under it, except the data folders
+ * (--data-dir), whose files the routes read and write: a change there is not a change of the sources, and reloading
+ * the routes for it restarts them, so they write again and reload again (CAMEL-25670).
+ */
+ /**
+ * --data-dir only changes what dev mode watches in a source directory: without one only the given files are
+ * watched, and their data folders are not, so the option has nothing to leave out. Said when it is given on the
+ * command line; camel.jbang.dataDir in an application.properties is not, as an example that declares its data
+ * folders also runs with its files (camel run --example).
+ */
Review Comment:
Right, the new method had landed between `sourceDirReloadPattern`'s javadoc and that method. Moved in 46311f0bca14, so each javadoc is on its own method again.
_Claude Code on behalf of @davsclaus._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27847:
URL: https://github.com/apache/camel/pull/27847#issuecomment-6179471818
<!-- ci-tested-modules -->
:test_tube: **CI tested the following changed modules:**
- `catalog/camel-catalog`
- `core/camel-core`
- `core/camel-support`
- `docs`
- `dsl/camel-jbang/camel-jbang-core`
> :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
:repeat: **4 tests passed only after a retry on JDK 25** (4 retried attempts)
<details><summary>Recovered flaky tests on JDK 25 (4)</summary>
| Module | Test | Failed attempts | First failure |
| --- | --- | --- | --- |
| `core/camel-core` | `FileConsumeMultipleDirectoriesTest.testMultiDir` | 1 | mock://result Body of message: 1. Expected: <Hello World> but was: <> |
| `core/camel-core` | `AggregateDiscardOnFailureTest.testAggregateDiscardOnAggregationFailureLast` | 1 | mock://aggregated Body of message: 1. Expected: <DEF> but was: <DE> |
| `core/camel-core` | `TotalRequestsThrottlerRateDecreaseTest.testDecreaseWhileExchangesWaitForPermits` | 1 | Condition with Lambda expression in org.apache.camel.processor.throttle.requests.TotalRequestsThrottlerRateDecreaseTest was not fulfilled within 5 seconds. |
| `core/camel-core` | `BackgroundTaskTest.testRunNoMoreSupplierWithDelay` | 1 | expected: <true> but was: <false> |
> :information_source: These tests did **not** fail the build. Surefire retried them and they passed.
> Retries are enabled project-wide by `surefire.rerunFailingTestsCount` in `parent/pom.xml`.
</details>
---
<details><summary>:microscope: Scalpel shadow comparison — Scalpel: 569 of 703 tested, 25 compile-only — current: 570 all tested</summary>
[Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **569 affected modules** (current approach: 570).
**Skip-tests mode would test 569 modules** (5 direct + 567 downstream), **skip tests for 25** (generated code, meta-modules)
<details><summary>Modules only in current approach (1)</summary>
- `camel-test-infra-core`
</details>
<details><summary>Modules Scalpel would test (569)</summary>
- `archetypes` ← downstream of org.apache.camel:camel-support
- `camel-a2a` ← downstream of org.apache.camel:camel-support
- `camel-activemq` ← downstream of org.apache.camel:camel-core-model
- `camel-activemq6` ← downstream of org.apache.camel:camel-core-model
- `camel-ai-observability` ← downstream of org.apache.camel:camel-support
- `camel-ai-observability-api` ← downstream of org.apache.camel:camel-support
- `camel-ai-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-ai-resource` ← downstream of org.apache.camel:camel-support
- `camel-ai-tool` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-common` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-eventbridge` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-fc` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-kms` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-mns` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-oss` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-ots` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-alibaba-sls` ← downstream of org.apache.camel:camel-support
- `camel-alibaba-sms` ← downstream of org.apache.camel:camel-support
- `camel-amqp` ← downstream of org.apache.camel:camel-core-model
- `camel-api-component-maven-plugin` ← downstream of org.apache.camel:camel-test-junit6
- `camel-arangodb` ← downstream of org.apache.camel:camel-support
- `camel-archetype-api-component` ← downstream of org.apache.camel:camel-support
- `camel-archetype-component` ← downstream of org.apache.camel:camel-support
- `camel-archetype-dataformat` ← downstream of org.apache.camel:camel-support
- `camel-archetype-java` ← downstream of org.apache.camel:camel-support
- `camel-archetype-main` ← downstream of org.apache.camel:camel-support
- `camel-as2` ← downstream of org.apache.camel:camel-support
- `camel-as2-api` ← downstream of org.apache.camel:camel-core-model
- `camel-as2-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-asn1` ← downstream of org.apache.camel:camel-support
- `camel-asterisk` ← downstream of org.apache.camel:camel-support
- `camel-atmosphere-websocket` ← downstream of org.apache.camel:camel-support
- `camel-atom` ← downstream of org.apache.camel:camel-support
- `camel-attachments` ← downstream of org.apache.camel:camel-support
- `camel-avro` ← downstream of org.apache.camel:camel-support
- `camel-avro-rpc` ← downstream of org.apache.camel:camel-support
- `camel-avro-rpc-jetty` ← downstream of org.apache.camel:camel-core-model
- `camel-avro-rpc-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-avro-rpc-spi` ← downstream of org.apache.camel:camel-core-model
- `camel-aws-bedrock` ← downstream of org.apache.camel:camel-support
- `camel-aws-cloudtrail` ← downstream of org.apache.camel:camel-support
- `camel-aws-common` ← downstream of org.apache.camel:camel-support
- `camel-aws-config` ← downstream of org.apache.camel:camel-support
- `camel-aws-parameter-store` ← downstream of org.apache.camel:camel-support
- `camel-aws-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-aws-secrets-manager` ← downstream of org.apache.camel:camel-support
- `camel-aws-security-hub` ← downstream of org.apache.camel:camel-support
- `camel-aws2-athena` ← downstream of org.apache.camel:camel-support
- `camel-aws2-comprehend` ← downstream of org.apache.camel:camel-support
- `camel-aws2-cw` ← downstream of org.apache.camel:camel-support
- `camel-aws2-ddb` ← downstream of org.apache.camel:camel-support
- `camel-aws2-ec2` ← downstream of org.apache.camel:camel-support
- `camel-aws2-ecs` ← downstream of org.apache.camel:camel-support
- `camel-aws2-eks` ← downstream of org.apache.camel:camel-support
- `camel-aws2-eventbridge` ← downstream of org.apache.camel:camel-support
- `camel-aws2-iam` ← downstream of org.apache.camel:camel-support
- `camel-aws2-kinesis` ← downstream of org.apache.camel:camel-support
- `camel-aws2-kms` ← downstream of org.apache.camel:camel-support
- `camel-aws2-lambda` ← downstream of org.apache.camel:camel-support
- `camel-aws2-mq` ← downstream of org.apache.camel:camel-support
- `camel-aws2-msk` ← downstream of org.apache.camel:camel-support
- `camel-aws2-polly` ← downstream of org.apache.camel:camel-support
- `camel-aws2-redshift` ← downstream of org.apache.camel:camel-support
- `camel-aws2-rekognition` ← downstream of org.apache.camel:camel-support
- `camel-aws2-s3` ← downstream of org.apache.camel:camel-support
- `camel-aws2-s3-vectors` ← downstream of org.apache.camel:camel-support
- `camel-aws2-ses` ← downstream of org.apache.camel:camel-support
- `camel-aws2-sns` ← downstream of org.apache.camel:camel-support
- `camel-aws2-sqs` ← downstream of org.apache.camel:camel-support
- `camel-aws2-step-functions` ← downstream of org.apache.camel:camel-support
- `camel-aws2-sts` ← downstream of org.apache.camel:camel-support
- `camel-aws2-textract` ← downstream of org.apache.camel:camel-support
- `camel-aws2-timestream` ← downstream of org.apache.camel:camel-support
- `camel-aws2-transcribe` ← downstream of org.apache.camel:camel-support
- `camel-aws2-translate` ← downstream of org.apache.camel:camel-support
- `camel-azure-common` ← downstream of org.apache.camel:camel-core-model
- `camel-azure-cosmosdb` ← downstream of org.apache.camel:camel-support
- `camel-azure-eventgrid` ← downstream of org.apache.camel:camel-support
- `camel-azure-eventhubs` ← downstream of org.apache.camel:camel-support
- `camel-azure-files` ← downstream of org.apache.camel:camel-core-model
- `camel-azure-functions` ← downstream of org.apache.camel:camel-support
- `camel-azure-key-vault` ← downstream of org.apache.camel:camel-support
- `camel-azure-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-azure-schema-registry` ← downstream of org.apache.camel:camel-support
- `camel-azure-servicebus` ← downstream of org.apache.camel:camel-support
- `camel-azure-storage-blob` ← downstream of org.apache.camel:camel-support
- `camel-azure-storage-datalake` ← downstream of org.apache.camel:camel-support
- `camel-azure-storage-queue` ← downstream of org.apache.camel:camel-support
- `camel-barcode` ← downstream of org.apache.camel:camel-support
- `camel-base` ← downstream of org.apache.camel:camel-support
- `camel-base-engine` ← downstream of org.apache.camel:camel-support
- `camel-base64` ← downstream of org.apache.camel:camel-support
- `camel-bean` ← downstream of org.apache.camel:camel-support
- `camel-bean-validator` ← downstream of org.apache.camel:camel-support
- `camel-beanio` ← downstream of org.apache.camel:camel-support
- `camel-bindy` ← downstream of org.apache.camel:camel-support
- `camel-bonita` ← downstream of org.apache.camel:camel-support
- `camel-box` ← downstream of org.apache.camel:camel-support
- `camel-box-api` ← downstream of org.apache.camel:camel-core-model
- `camel-box-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-braintree` ← downstream of org.apache.camel:camel-support
- `camel-browse` ← downstream of org.apache.camel:camel-support
- `camel-caffeine` ← downstream of org.apache.camel:camel-support
- `camel-camunda` ← downstream of org.apache.camel:camel-support
- `camel-cassandraql` ← downstream of org.apache.camel:camel-support
- `camel-catalog-common` ← downstream of org.apache.camel:camel-support
- `camel-cbor` ← downstream of org.apache.camel:camel-support
- `camel-chatscript` ← downstream of org.apache.camel:camel-support
- `camel-chunk` ← downstream of org.apache.camel:camel-support
- `camel-cli-connector` ← downstream of org.apache.camel:camel-support
- `camel-cli-debug` ← downstream of org.apache.camel:camel-cli-connector
- `camel-clickhouse` ← downstream of org.apache.camel:camel-support
- `camel-clickup` ← downstream of org.apache.camel:camel-support
- `camel-cloudevents` ← downstream of org.apache.camel:camel-support
- `camel-cluster` ← downstream of org.apache.camel:camel-support
- `camel-cm-sms` ← downstream of org.apache.camel:camel-support
- `camel-coap` ← downstream of org.apache.camel:camel-support
- `camel-cometd` ← downstream of org.apache.camel:camel-support
- `camel-console` ← downstream of org.apache.camel:camel-support
- `camel-consul` ← downstream of org.apache.camel:camel-support
- `camel-controlbus` ← downstream of org.apache.camel:camel-support
- `camel-core` ← core/camel-core/src/test/java/org/apache/camel/support/RouteWatcherReloadDataDirTest.java
- `camel-core-all` ← downstream of org.apache.camel:camel-support
- `camel-core-engine` ← downstream of org.apache.camel:camel-support
- `camel-core-languages` ← downstream of org.apache.camel:camel-support
- `camel-core-model` ← downstream of org.apache.camel:camel-support
- `camel-core-processor` ← downstream of org.apache.camel:camel-support
- `camel-core-reifier` ← downstream of org.apache.camel:camel-support
- `camel-core-xml` ← downstream of org.apache.camel:camel-core-engine
- `camel-couchbase` ← downstream of org.apache.camel:camel-support
- `camel-couchdb` ← downstream of org.apache.camel:camel-support
- `camel-cron` ← downstream of org.apache.camel:camel-support
- `camel-crypto` ← downstream of org.apache.camel:camel-support
- `camel-crypto-pgp` ← downstream of org.apache.camel:camel-support
- `camel-csv` ← downstream of org.apache.camel:camel-support
- `camel-cxf-common` ← downstream of org.apache.camel:camel-support
- `camel-cxf-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-cxf-rest` ← downstream of org.apache.camel:camel-support
- `camel-cxf-soap` ← downstream of org.apache.camel:camel-support
- `camel-cxf-spring-common` ← downstream of org.apache.camel:camel-support
- `camel-cxf-spring-rest` ← downstream of org.apache.camel:camel-core-model
- `camel-cxf-spring-soap` ← downstream of org.apache.camel:camel-core-model
- `camel-cxf-spring-transport` ← downstream of org.apache.camel:camel-core-model
- `camel-cxf-transport` ← downstream of org.apache.camel:camel-support
- `camel-cyberark-vault` ← downstream of org.apache.camel:camel-support
- `camel-dapr` ← downstream of org.apache.camel:camel-support
- `camel-dataformat` ← downstream of org.apache.camel:camel-support
- `camel-dataset` ← downstream of org.apache.camel:camel-core-model
- `camel-datasonnet` ← downstream of org.apache.camel:camel-support
- `camel-dataweave` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-common` ← downstream of org.apache.camel:camel-support
- `camel-debezium-common-parent` ← downstream of org.apache.camel:camel-support
- `camel-debezium-db2` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-maven-plugin` ← downstream of org.apache.camel:camel-support
- `camel-debezium-mongodb` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-mysql` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-oracle` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-postgres` ← downstream of org.apache.camel:camel-core-model
- `camel-debezium-sqlserver` ← downstream of org.apache.camel:camel-core-model
- `camel-debug` ← downstream of org.apache.camel:camel-support
- `camel-dfdl` ← downstream of org.apache.camel:camel-support
- `camel-dhis2` ← downstream of org.apache.camel:camel-support
- `camel-dhis2-api` ← downstream of org.apache.camel:camel-support
- `camel-dhis2-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-diagram` ← downstream of org.apache.camel:camel-core-model
- `camel-direct` ← downstream of org.apache.camel:camel-support
- `camel-disruptor` ← downstream of org.apache.camel:camel-support
- `camel-djl` ← downstream of org.apache.camel:camel-support
- `camel-dns` ← downstream of org.apache.camel:camel-support
- `camel-docker` ← downstream of org.apache.camel:camel-support
- `camel-docling` ← downstream of org.apache.camel:camel-support
- `camel-drill` ← downstream of org.apache.camel:camel-support
- `camel-dropbox` ← downstream of org.apache.camel:camel-support
- `camel-dsl-modeline` ← downstream of org.apache.camel:camel-support
- `camel-dsl-support` ← downstream of org.apache.camel:camel-support
- `camel-duckdb` ← downstream of org.apache.camel:camel-support
- `camel-dynamic-router` ← downstream of org.apache.camel:camel-support
- `camel-ehcache` ← downstream of org.apache.camel:camel-support
- `camel-elasticsearch` ← downstream of org.apache.camel:camel-support
- `camel-elasticsearch-rest-client` ← downstream of org.apache.camel:camel-support
- `camel-event` ← downstream of org.apache.camel:camel-support
- `camel-exec` ← downstream of org.apache.camel:camel-support
- `camel-fastjson` ← downstream of org.apache.camel:camel-support
- `camel-fhir` ← downstream of org.apache.camel:camel-support
- `camel-fhir-api` ← downstream of org.apache.camel:camel-support
- `camel-fhir-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-file` ← downstream of org.apache.camel:camel-support
- `camel-file-watch` ← downstream of org.apache.camel:camel-support
- `camel-flatpack` ← downstream of org.apache.camel:camel-core-model
- `camel-flink` ← downstream of org.apache.camel:camel-support
- `camel-flowable` ← downstream of org.apache.camel:camel-support
- `camel-fop` ← downstream of org.apache.camel:camel-support
- `camel-fory` ← downstream of org.apache.camel:camel-support
- `camel-freemarker` ← downstream of org.apache.camel:camel-support
- `camel-ftp` ← downstream of org.apache.camel:camel-core-model
- `camel-ftp-common` ← downstream of org.apache.camel:camel-core-model
- `camel-geocoder` ← downstream of org.apache.camel:camel-support
- `camel-git` ← downstream of org.apache.camel:camel-support
- `camel-github2` ← downstream of org.apache.camel:camel-support
- `camel-google-bigquery` ← downstream of org.apache.camel:camel-support
- `camel-google-calendar` ← downstream of org.apache.camel:camel-support
- `camel-google-common` ← downstream of org.apache.camel:camel-support
- `camel-google-drive` ← downstream of org.apache.camel:camel-support
- `camel-google-firestore` ← downstream of org.apache.camel:camel-support
- `camel-google-functions` ← downstream of org.apache.camel:camel-support
- `camel-google-mail` ← downstream of org.apache.camel:camel-support
- `camel-google-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-google-pubsub` ← downstream of org.apache.camel:camel-support
- `camel-google-secret-manager` ← downstream of org.apache.camel:camel-support
- `camel-google-sheets` ← downstream of org.apache.camel:camel-support
- `camel-google-speech-to-text` ← downstream of org.apache.camel:camel-support
- `camel-google-storage` ← downstream of org.apache.camel:camel-support
- `camel-google-text-to-speech` ← downstream of org.apache.camel:camel-support
- `camel-google-vertexai` ← downstream of org.apache.camel:camel-support
- `camel-google-vision` ← downstream of org.apache.camel:camel-support
- `camel-graphql` ← downstream of org.apache.camel:camel-support
- `camel-grok` ← downstream of org.apache.camel:camel-support
- `camel-groovy` ← downstream of org.apache.camel:camel-support
- `camel-grpc` ← downstream of org.apache.camel:camel-support
- `camel-gson` ← downstream of org.apache.camel:camel-support
- `camel-hashicorp-vault` ← downstream of org.apache.camel:camel-support
- `camel-hazelcast` ← downstream of org.apache.camel:camel-support
- `camel-health` ← downstream of org.apache.camel:camel-support
- `camel-hivemq` ← downstream of org.apache.camel:camel-support
- `camel-hl7` ← downstream of org.apache.camel:camel-core-model
- `camel-http` ← downstream of org.apache.camel:camel-core-model
- `camel-http-base` ← downstream of org.apache.camel:camel-support
- `camel-http-common` ← downstream of org.apache.camel:camel-support
- `camel-huawei-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-huaweicloud-common` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-dms` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-frs` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-functiongraph` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-iam` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-imagerecognition` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-obs` ← downstream of org.apache.camel:camel-support
- `camel-huaweicloud-smn` ← downstream of org.apache.camel:camel-support
- `camel-huggingface` ← downstream of org.apache.camel:camel-support
- `camel-ibm-cos` ← downstream of org.apache.camel:camel-support
- `camel-ibm-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-ibm-secrets-manager` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watson-discovery` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watson-language` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watson-speech-to-text` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watson-text-to-speech` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watsonx-ai` ← downstream of org.apache.camel:camel-support
- `camel-ibm-watsonx-data` ← downstream of org.apache.camel:camel-support
- `camel-ical` ← downstream of org.apache.camel:camel-support
- `camel-iggy` ← downstream of org.apache.camel:camel-support
- `camel-ignite` ← downstream of org.apache.camel:camel-support
- `camel-infinispan` ← downstream of org.apache.camel:camel-core-model
- `camel-infinispan-common` ← downstream of org.apache.camel:camel-support
- `camel-infinispan-embedded` ← downstream of org.apache.camel:camel-core-model
- `camel-infinispan-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-influxdb` ← downstream of org.apache.camel:camel-support
- `camel-influxdb2` ← downstream of org.apache.camel:camel-support
- `camel-iso8583` ← downstream of org.apache.camel:camel-support
- `camel-jackson` ← downstream of org.apache.camel:camel-core-model
- `camel-jackson-avro` ← downstream of org.apache.camel:camel-support
- `camel-jackson-protobuf` ← downstream of org.apache.camel:camel-support
- `camel-jackson3` ← downstream of org.apache.camel:camel-core-model
- `camel-jackson3-avro` ← downstream of org.apache.camel:camel-support
- `camel-jackson3-protobuf` ← downstream of org.apache.camel:camel-support
- `camel-jackson3xml` ← downstream of org.apache.camel:camel-support
- `camel-jacksonxml` ← downstream of org.apache.camel:camel-support
- `camel-jactl` ← downstream of org.apache.camel:camel-support
- `camel-jandex` ← downstream of org.apache.camel:camel-support
- `camel-jasypt` ← downstream of org.apache.camel:camel-base
- `camel-java-io` ← downstream of org.apache.camel:camel-core-engine
- `camel-java-joor-dsl` ← downstream of org.apache.camel:camel-core-languages
- `camel-javascript` ← downstream of org.apache.camel:camel-support
- `camel-jaxb` ← downstream of org.apache.camel:camel-core-model
- `camel-jbang-console` ← downstream of org.apache.camel:camel-support
- `camel-jbang-mcp` ← downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-mcp` ← downstream of org.apache.camel:camel-jbang-core
- `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-jbang-core
- `camel-jcache` ← downstream of org.apache.camel:camel-support
- `camel-jcr` ← downstream of org.apache.camel:camel-support
- `camel-jdbc` ← downstream of org.apache.camel:camel-support
- `camel-jetty` ← downstream of org.apache.camel:camel-support
- `camel-jetty-common` ← downstream of org.apache.camel:camel-core-model
- `camel-jfr` ← downstream of org.apache.camel:camel-support
- `camel-jgroups` ← downstream of org.apache.camel:camel-support
- `camel-jgroups-raft` ← downstream of org.apache.camel:camel-support
- `camel-jira` ← downstream of org.apache.camel:camel-support
- `camel-jms` ← downstream of org.apache.camel:camel-support
- `camel-jmx` ← downstream of org.apache.camel:camel-support
- `camel-jolt` ← downstream of org.apache.camel:camel-support
- `camel-jooq` ← downstream of org.apache.camel:camel-support
- `camel-joor` ← downstream of org.apache.camel:camel-support
- `camel-jpa` ← downstream of org.apache.camel:camel-support
- `camel-jq` ← downstream of org.apache.camel:camel-support
- `camel-jsch` ← downstream of org.apache.camel:camel-core-model
- `camel-jslt` ← downstream of org.apache.camel:camel-support
- `camel-json-validator` ← downstream of org.apache.camel:camel-support
- `camel-jsonapi` ← downstream of org.apache.camel:camel-support
- `camel-jsonata` ← downstream of org.apache.camel:camel-support
- `camel-jsonb` ← downstream of org.apache.camel:camel-support
- `camel-jsonpath` ← downstream of org.apache.camel:camel-support
- `camel-jsoup` ← downstream of org.apache.camel:camel-support
- `camel-jt400` ← downstream of org.apache.camel:camel-support
- `camel-jta` ← downstream of org.apache.camel:camel-support
- `camel-jte` ← downstream of org.apache.camel:camel-support
- `camel-kafka` ← downstream of org.apache.camel:camel-support
- `camel-kafka-common` ← downstream of org.apache.camel:camel-support
- `camel-kafka-share` ← downstream of org.apache.camel:camel-support
- `camel-kamelet` ← downstream of org.apache.camel:camel-core-model
- `camel-kamelet-main-support` ← downstream of org.apache.camel:camel-main
- `camel-keycloak` ← downstream of org.apache.camel:camel-support
- `camel-knative` ← downstream of org.apache.camel:camel-support
- `camel-knative-api` ← downstream of org.apache.camel:camel-support
- `camel-knative-http` ← downstream of org.apache.camel:camel-core-model
- `camel-knative-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-kserve` ← downstream of org.apache.camel:camel-support
- `camel-kubernetes` ← downstream of org.apache.camel:camel-support
- `camel-kudu` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-agent` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-agent-api` ← downstream of org.apache.camel:camel-core-model
- `camel-langchain4j-chat` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-core` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-embeddings` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-embeddingstore` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-embeddingstore-api` ← downstream of org.apache.camel:camel-core-model
- `camel-langchain4j-ingest` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-tokenizer` ← downstream of org.apache.camel:camel-support
- `camel-langchain4j-web-search` ← downstream of org.apache.camel:camel-support
- `camel-language` ← downstream of org.apache.camel:camel-support
- `camel-launcher-container` ← downstream of org.apache.camel:camel-launcher
- `camel-ldap` ← downstream of org.apache.camel:camel-support
- `camel-ldif` ← downstream of org.apache.camel:camel-support
- `camel-log` ← downstream of org.apache.camel:camel-support
- `camel-lra` ← downstream of org.apache.camel:camel-core-model
- `camel-lucene` ← downstream of org.apache.camel:camel-support
- `camel-lumberjack` ← downstream of org.apache.camel:camel-support
- `camel-lzf` ← downstream of org.apache.camel:camel-support
- `camel-mail` ← downstream of org.apache.camel:camel-support
- `camel-mail-microsoft-oauth` ← downstream of org.apache.camel:camel-core-model
- `camel-main` ← downstream of org.apache.camel:camel-support
- `camel-management` ← downstream of org.apache.camel:camel-core-engine
- `camel-mapstruct` ← downstream of org.apache.camel:camel-support
- `camel-master` ← downstream of org.apache.camel:camel-support
- `camel-maven-plugin` ← downstream of org.apache.camel:camel-spring-main
- `camel-mcp-server` ← downstream of org.apache.camel:camel-core-model
- `camel-mcp-server-api` ← downstream of org.apache.camel:camel-support
- `camel-mdc` ← downstream of org.apache.camel:camel-support
- `camel-metrics` ← downstream of org.apache.camel:camel-support
- `camel-micrometer` ← downstream of org.apache.camel:camel-support
- `camel-micrometer-observability` ← downstream of org.apache.camel:camel-core-model
- `camel-micrometer-prometheus` ← downstream of org.apache.camel:camel-core-model
- `camel-microprofile-config` ← downstream of org.apache.camel:camel-support
- `camel-microprofile-fault-tolerance` ← downstream of org.apache.camel:camel-support
- `camel-microprofile-health` ← downstream of org.apache.camel:camel-core-model
- `camel-microprofile-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-milo` ← downstream of org.apache.camel:camel-support
- `camel-milvus` ← downstream of org.apache.camel:camel-support
- `camel-mina` ← downstream of org.apache.camel:camel-support
- `camel-mina-sftp` ← downstream of org.apache.camel:camel-core-model
- `camel-minio` ← downstream of org.apache.camel:camel-support
- `camel-mllp` ← downstream of org.apache.camel:camel-support
- `camel-mock` ← downstream of org.apache.camel:camel-support
- `camel-mongodb` ← downstream of org.apache.camel:camel-support
- `camel-mongodb-gridfs` ← downstream of org.apache.camel:camel-support
- `camel-mustache` ← downstream of org.apache.camel:camel-support
- `camel-mvel` ← downstream of org.apache.camel:camel-support
- `camel-mybatis` ← downstream of org.apache.camel:camel-core-model
- `camel-nats` ← downstream of org.apache.camel:camel-support
- `camel-neo4j` ← downstream of org.apache.camel:camel-support
- `camel-netty` ← downstream of org.apache.camel:camel-support
- `camel-netty-http` ← downstream of org.apache.camel:camel-core-model
- `camel-oaipmh` ← downstream of org.apache.camel:camel-support
- `camel-oauth` ← downstream of org.apache.camel:camel-support
- `camel-observability-services` ← downstream of org.apache.camel:camel-core-model
- `camel-observation` ← downstream of org.apache.camel:camel-support
- `camel-ocsf` ← downstream of org.apache.camel:camel-support
- `camel-odata` ← downstream of org.apache.camel:camel-support
- `camel-ognl` ← downstream of org.apache.camel:camel-support
- `camel-olingo2` ← downstream of org.apache.camel:camel-support
- `camel-olingo2-api` ← downstream of org.apache.camel:camel-core-model
- `camel-olingo2-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-olingo4` ← downstream of org.apache.camel:camel-support
- `camel-olingo4-api` ← downstream of org.apache.camel:camel-support
- `camel-olingo4-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-once` ← downstream of org.apache.camel:camel-support
- `camel-opa` ← downstream of org.apache.camel:camel-support
- `camel-openai` ← downstream of org.apache.camel:camel-support
- `camel-openapi-java` ← downstream of org.apache.camel:camel-core-model
- `camel-openapi-rest-dsl-generator` ← downstream of org.apache.camel:camel-support
- `camel-openapi-validator` ← downstream of org.apache.camel:camel-core-model
- `camel-openfeature` ← downstream of org.apache.camel:camel-support
- `camel-openfga` ← downstream of org.apache.camel:camel-support
- `camel-opensearch` ← downstream of org.apache.camel:camel-support
- `camel-openstack` ← downstream of org.apache.camel:camel-support
- `camel-opentelemetry` ← downstream of org.apache.camel:camel-support
- `camel-opentelemetry-metrics` ← downstream of org.apache.camel:camel-support
- `camel-opentelemetry2` ← downstream of org.apache.camel:camel-core-model
- `camel-optaplanner` ← downstream of org.apache.camel:camel-support
- `camel-paho` ← downstream of org.apache.camel:camel-support
- `camel-paho-mqtt5` ← downstream of org.apache.camel:camel-support
- `camel-parquet-avro` ← downstream of org.apache.camel:camel-support
- `camel-pdf` ← downstream of org.apache.camel:camel-support
- `camel-pg-replication-slot` ← downstream of org.apache.camel:camel-support
- `camel-pgevent` ← downstream of org.apache.camel:camel-support
- `camel-pgvector` ← downstream of org.apache.camel:camel-support
- `camel-pinecone` ← downstream of org.apache.camel:camel-support
- `camel-platform-http` ← downstream of org.apache.camel:camel-core-model
- `camel-platform-http-jolokia` ← downstream of org.apache.camel:camel-support
- `camel-platform-http-main` ← downstream of org.apache.camel:camel-core-model
- `camel-platform-http-vertx` ← downstream of org.apache.camel:camel-core-model
- `camel-plc4x` ← downstream of org.apache.camel:camel-support
- `camel-pqc` ← downstream of org.apache.camel:camel-support
- `camel-printer` ← downstream of org.apache.camel:camel-support
- `camel-protobuf` ← downstream of org.apache.camel:camel-support
- `camel-pubnub` ← downstream of org.apache.camel:camel-support
- `camel-pulsar` ← downstream of org.apache.camel:camel-support
- `camel-python` ← downstream of org.apache.camel:camel-support
- `camel-python3` ← downstream of org.apache.camel:camel-support
- `camel-qdrant` ← downstream of org.apache.camel:camel-support
- `camel-quartz` ← downstream of org.apache.camel:camel-support
- `camel-quickfix` ← downstream of org.apache.camel:camel-support
- `camel-quickjs` ← downstream of org.apache.camel:camel-support
- `camel-reactive-streams` ← downstream of org.apache.camel:camel-core-model
- `camel-reactor` ← downstream of org.apache.camel:camel-support
- `camel-redis` ← downstream of org.apache.camel:camel-support
- `camel-ref` ← downstream of org.apache.camel:camel-support
- `camel-resilience4j` ← downstream of org.apache.camel:camel-support
- `camel-resilience4j-micrometer` ← downstream of org.apache.camel:camel-core-model
- `camel-resourceresolver-github` ← downstream of org.apache.camel:camel-support
- `camel-rest` ← downstream of org.apache.camel:camel-support
- `camel-rest-openapi` ← downstream of org.apache.camel:camel-support
- `camel-rest-postman` ← downstream of org.apache.camel:camel-support
- `camel-restdsl-openapi-plugin` ← downstream of org.apache.camel:camel-core-engine
- `camel-robotframework` ← downstream of org.apache.camel:camel-support
- `camel-rocketmq` ← downstream of org.apache.camel:camel-support
- `camel-rss` ← downstream of org.apache.camel:camel-support
- `camel-rxjava` ← downstream of org.apache.camel:camel-support
- `camel-saga` ← downstream of org.apache.camel:camel-support
- `camel-salesforce` ← downstream of org.apache.camel:camel-core-model
- `camel-salesforce-codegen` ← downstream of org.apache.camel:camel-core-model
- `camel-salesforce-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-sap-netweaver` ← downstream of org.apache.camel:camel-support
- `camel-saxon` ← downstream of org.apache.camel:camel-core-model
- `camel-scheduler` ← downstream of org.apache.camel:camel-support
- `camel-schematron` ← downstream of org.apache.camel:camel-support
- `camel-seda` ← downstream of org.apache.camel:camel-support
- `camel-semantic` ← downstream of org.apache.camel:camel-support
- `camel-servicenow` ← downstream of org.apache.camel:camel-support
- `camel-servicenow-maven-plugin` ← downstream of org.apache.camel:camel-core-model
- `camel-servicenow-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-servlet` ← downstream of org.apache.camel:camel-support
- `camel-shell` ← downstream of org.apache.camel:camel-support
- `camel-shiro` ← downstream of org.apache.camel:camel-support
- `camel-sjms` ← downstream of org.apache.camel:camel-support
- `camel-sjms2` ← downstream of org.apache.camel:camel-support
- `camel-slack` ← downstream of org.apache.camel:camel-support
- `camel-smb` ← downstream of org.apache.camel:camel-support
- `camel-smooks` ← downstream of org.apache.camel:camel-support
- `camel-smpp` ← downstream of org.apache.camel:camel-support
- `camel-snakeyaml` ← downstream of org.apache.camel:camel-support
- `camel-snmp` ← downstream of org.apache.camel:camel-support
- `camel-soap` ← downstream of org.apache.camel:camel-support
- `camel-solr` ← downstream of org.apache.camel:camel-support
- `camel-spiffe` ← downstream of org.apache.camel:camel-support
- `camel-splunk-hec` ← downstream of org.apache.camel:camel-support
- `camel-spring` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-ai-chat` ← downstream of org.apache.camel:camel-support
- `camel-spring-ai-embeddings` ← downstream of org.apache.camel:camel-support
- `camel-spring-ai-image` ← downstream of org.apache.camel:camel-support
- `camel-spring-ai-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-ai-vector-store` ← downstream of org.apache.camel:camel-support
- `camel-spring-batch` ← downstream of org.apache.camel:camel-support
- `camel-spring-cloud-config` ← downstream of org.apache.camel:camel-support
- `camel-spring-jdbc` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-ldap` ← downstream of org.apache.camel:camel-support
- `camel-spring-main` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-rabbitmq` ← downstream of org.apache.camel:camel-support
- `camel-spring-redis` ← downstream of org.apache.camel:camel-support
- `camel-spring-security` ← downstream of org.apache.camel:camel-core-model
- `camel-spring-ws` ← downstream of org.apache.camel:camel-support
- `camel-spring-xml` ← downstream of org.apache.camel:camel-core-model
- `camel-sql` ← downstream of org.apache.camel:camel-support
- `camel-ssh` ← downstream of org.apache.camel:camel-support
- `camel-state-store` ← downstream of org.apache.camel:camel-support
- `camel-state-store-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-stax` ← downstream of org.apache.camel:camel-support
- `camel-stitch` ← downstream of org.apache.camel:camel-support
- `camel-stream` ← downstream of org.apache.camel:camel-support
- `camel-streamcaching-test` ← downstream of org.apache.camel:camel-test-junit6
- `camel-stringtemplate` ← downstream of org.apache.camel:camel-support
- `camel-stripe` ← downstream of org.apache.camel:camel-support
- `camel-stub` ← downstream of org.apache.camel:camel-core-model
- `camel-support` ← core/camel-support/src/main/java/org/apache/camel/support/FileWatcherResourceReloadStrategy.java, core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
- `camel-swift` ← downstream of org.apache.camel:camel-support
- `camel-syslog` ← downstream of org.apache.camel:camel-support
- `camel-tahu` ← downstream of org.apache.camel:camel-support
- `camel-tarfile` ← downstream of org.apache.camel:camel-core-model
- `camel-telegram` ← downstream of org.apache.camel:camel-support
- `camel-telemetry` ← downstream of org.apache.camel:camel-support
- `camel-telemetry-dev` ← downstream of org.apache.camel:camel-core-model
- `camel-tensorflow-serving` ← downstream of org.apache.camel:camel-support
- `camel-test-infra-all` ← downstream of org.apache.camel:camel-test-infra-artemis
- `camel-test-infra-artemis` ← downstream of org.apache.camel:camel-test-junit6
- `camel-test-infra-cli` ← downstream of org.apache.camel:camel-support
- `camel-test-infra-smb` ← downstream of org.apache.camel:camel-test-junit6
- `camel-test-junit5` ← downstream of org.apache.camel:camel-support
- `camel-test-junit6` ← downstream of org.apache.camel:camel-support
- `camel-test-main-junit5` ← downstream of org.apache.camel:camel-core-model
- `camel-test-main-junit6` ← downstream of org.apache.camel:camel-core-model
- `camel-test-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-test-spring-junit5` ← downstream of org.apache.camel:camel-core-model
- `camel-test-spring-junit6` ← downstream of org.apache.camel:camel-core-model
- `camel-thrift` ← downstream of org.apache.camel:camel-support
- `camel-thymeleaf` ← downstream of org.apache.camel:camel-support
- `camel-tika` ← downstream of org.apache.camel:camel-support
- `camel-timer` ← downstream of org.apache.camel:camel-support
- `camel-tooling-maven` ← downstream of org.apache.camel:camel-support
- `camel-toon` ← downstream of org.apache.camel:camel-support
- `camel-tracing` ← downstream of org.apache.camel:camel-support
- `camel-twilio` ← downstream of org.apache.camel:camel-support
- `camel-twitter` ← downstream of org.apache.camel:camel-support
- `camel-typesafe-ai` ← downstream of org.apache.camel:camel-support
- `camel-ubl` ← downstream of org.apache.camel:camel-support
- `camel-undertow` ← downstream of org.apache.camel:camel-support
- `camel-undertow-spring-security` ← downstream of org.apache.camel:camel-core-model
- `camel-univocity-parsers` ← downstream of org.apache.camel:camel-support
- `camel-validator` ← downstream of org.apache.camel:camel-support
- `camel-velocity` ← downstream of org.apache.camel:camel-support
- `camel-vertx` ← downstream of org.apache.camel:camel-support
- `camel-vertx-common` ← downstream of org.apache.camel:camel-support
- `camel-vertx-http` ← downstream of org.apache.camel:camel-core-model
- `camel-vertx-parent` ← downstream of org.apache.camel:camel-core-model
- `camel-vertx-websocket` ← downstream of org.apache.camel:camel-support
- `camel-wal` ← downstream of org.apache.camel:camel-support
- `camel-wasm` ← downstream of org.apache.camel:camel-support
- `camel-weather` ← downstream of org.apache.camel:camel-support
- `camel-weaviate` ← downstream of org.apache.camel:camel-support
- `camel-web3j` ← downstream of org.apache.camel:camel-support
- `camel-webhook` ← downstream of org.apache.camel:camel-support
- `camel-whatsapp` ← downstream of org.apache.camel:camel-support
- `camel-wolf-defender` ← downstream of org.apache.camel:camel-support
- `camel-wordpress` ← downstream of org.apache.camel:camel-support
- `camel-workday` ← downstream of org.apache.camel:camel-support
- `camel-xchange` ← downstream of org.apache.camel:camel-support
- `camel-xj` ← downstream of org.apache.camel:camel-core-model
- `camel-xml-io` ← downstream of org.apache.camel:camel-core-model
- `camel-xml-io-dsl` ← downstream of org.apache.camel:camel-core-engine
- `camel-xml-jaxb` ← downstream of org.apache.camel:camel-support
- `camel-xml-jaxb-dsl` ← downstream of org.apache.camel:camel-core-languages
- `camel-xml-jaxb-dsl-test-definition` ← downstream of org.apache.camel:camel-support
- `camel-xml-jaxb-dsl-test-spring` ← downstream of org.apache.camel:camel-support
- `camel-xml-jaxp` ← downstream of org.apache.camel:camel-support
- `camel-xmlsecurity` ← downstream of org.apache.camel:camel-support
- `camel-xmpp` ← downstream of org.apache.camel:camel-support
- `camel-xpath` ← downstream of org.apache.camel:camel-support
- `camel-xslt` ← downstream of org.apache.camel:camel-support
- `camel-xslt-saxon` ← downstream of org.apache.camel:camel-core-model
- `camel-yaml-dsl-common` ← downstream of org.apache.camel:camel-core-engine
- `camel-yaml-dsl-validator` ← downstream of org.apache.camel:camel-catalog
- `camel-yaml-dsl-validator-maven-plugin` ← downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-yaml-io` ← downstream of org.apache.camel:camel-core-model
- `camel-zendesk` ← downstream of org.apache.camel:camel-support
- `camel-zip-deflater` ← downstream of org.apache.camel:camel-support
- `camel-zipfile` ← downstream of org.apache.camel:camel-support
- `camel-zookeeper` ← downstream of org.apache.camel:camel-support
- `camel-zookeeper-master` ← downstream of org.apache.camel:camel-support
- `components` ← downstream of org.apache.camel:camel-core-model
</details>
<details><summary>Modules with tests skipped (25)</summary>
- `apache-camel`
- `camel-allcomponents`
- `camel-catalog-console`
- `camel-catalog-maven`
- `camel-catalog-suggest`
- `camel-componentdsl`
- `camel-endpointdsl`
- `camel-endpointdsl-support`
- `camel-itest`
- `camel-jbang-it`
- `camel-jbang-main`
- `camel-jbang-plugin-edit`
- `camel-jbang-plugin-generate`
- `camel-jbang-plugin-kubernetes`
- `camel-jbang-plugin-test`
- `camel-kamelet-main`
- `camel-launcher`
- `camel-report-maven-plugin`
- `camel-route-parser`
- `camel-salesforce-maven-plugin`
- `camel-yaml-dsl`
- `camel-yaml-dsl-deserializers`
- `camel-yaml-dsl-maven-plugin`
- `coverage`
- `dummy-component`
</details>
> :information_source: Shadow mode — Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
</details>
:warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
- `dsl/camel-jbang/camel-jbang-core`: 2 test(s) disabled on GitHub Actions
- `core/camel-core`: 4 test(s) disabled on GitHub Actions
:bulb: **Manual integration tests recommended:**
> You modified `dsl/camel-jbang/camel-jbang-core`. The related integration tests in `dsl/camel-jbang/camel-jbang-it` are excluded from CI. Consider running them manually:
> ```
> mvn verify -f dsl/camel-jbang/camel-jbang-it -Djbang-it-test
> ```
<details><summary>Build reactor — dependencies compiled but only changed modules were tested (5 modules, 1m 6s total)</summary>
**Total reactor time:** 1m 6s
| Module | Duration | Status |
| --- | --- | --- |
| Camel :: Catalog :: Camel Catalog | 28.9s | SUCCESS |
| Camel :: Docs | 21.9s | SUCCESS |
| Camel :: Support | 15.6s | SUCCESS |
| Camel :: Core | n/a | |
| Camel :: JBang :: Core | n/a | |
**Top 20 slowest modules:**
- `Camel :: Catalog :: Camel Catalog` (28.9s)
- `Camel :: Docs` (21.9s)
- `Camel :: Support` (15.6s)
</details>
---
:gear: [View full build and test results](https://github.com/apache/camel/actions/runs/38625769334)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #27847:
URL: https://github.com/apache/camel/pull/27847#discussion_r4275256820
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,114 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ AntPathMatcher matcher = new AntPathMatcher();
+ for (String part : excludes) {
Review Comment:
Done in 3d9dc19eaf34: `isExcludedDirectory` uses `AntPathMatcher.INSTANCE`.
_Claude Code on behalf of @davsclaus._
##########
core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java:
##########
@@ -193,6 +230,114 @@ protected void doStart() throws Exception {
super.doStart();
}
+ private static boolean matches(AntPathMatcher matcher, String part, String name, String path, String relative) {
+ return name.equals(part) || matcher.match(part, path, false)
+ || relative != null && matcher.match(part, relative, false);
+ }
+
+ /**
+ * A folder that an exclude of the pattern matches as a whole, such as <tt>inbox</tt> for <tt>!inbox/**</tt>: the
+ * folder is left out of the scan, so the files the routes read and write in it are not walked on every scan.
+ */
+ @Override
+ protected boolean isExcludedDirectory(Path dir) {
+ if (excludes.isEmpty() || folder == null) {
+ return false;
+ }
+ String relative = relativePath(dir.toFile());
+ if (relative == null || relative.isEmpty()) {
+ return false;
+ }
+ AntPathMatcher matcher = new AntPathMatcher();
+ for (String part : excludes) {
+ // inbox and inbox/** match the folder itself; a file pattern such as *.json does not leave a folder out
+ if (part.equals(relative) || matcher.match(part, relative + "/_", false)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** The path of the file relative to the watched folder, with / separators, or null when it is not under it. */
+ private String relativePath(File file) {
+ String base = new File(getFolder()).getAbsolutePath();
+ String path = file.getAbsolutePath();
+ if (!path.startsWith(base)) {
+ return null;
+ }
+ String relative = path.substring(base.length()).replace('\\', '/');
+ while (relative.startsWith("/")) {
+ relative = relative.substring(1);
+ }
+ return relative;
+ }
+
+ /**
+ * Routes that write files into a folder under the watched one reload themselves: the reload restarts the routes,
+ * they write again, and that is a change again (a file copied into an inbox, moved to done or archive). When the
+ * last {@link #LOOP_RELOADS} reloads within {@link #LOOP_MILLIS} were each for files under the same folder only,
+ * and none of those files is a source of a route, a properties file or a Java or Groovy source, a WARN names the
+ * folder and how to leave it out of reloading, once per folder (CAMEL-25670).
+ *
+ * @return whether the warning was logged now
+ */
+ boolean checkReloadLoop(List<File> changed, long now) {
+ String data = dataFolder(changed);
+ if (data == null) {
+ dataReloads.clear();
+ return false;
+ }
+ dataReloads.addLast(new DataReload(now, data));
+ while (dataReloads.size() > LOOP_RELOADS) {
+ dataReloads.removeFirst();
+ }
+ long took = now - dataReloads.getFirst().time();
+ if (dataReloads.size() == LOOP_RELOADS && took <= LOOP_MILLIS
+ && dataReloads.stream().allMatch(r -> r.folder().equals(data)) && loopWarned.add(data)) {
+ LOG.warn("Routes reloaded {} times in {} seconds, each time because files under {}/ changed, which are not"
+ + " sources of the routes. If that folder holds data the routes read or write, leave it out of"
+ + " reloading: camel run --data-dir={}, or !{}/** in the reload pattern"
+ + " (camel.main.routesReloadPattern).",
+ LOOP_RELOADS, Math.max(1, Math.round(took / 1000.0)), data, data, data);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * The folder right under the watched one that holds all the changed files, when none of them is a source (a route
+ * was loaded from it, or it is a properties, Java or Groovy file), else null.
+ */
+ private String dataFolder(List<File> changed) {
+ Set<String> sources = new HashSet<>();
+ for (Route route : getCamelContext().getRoutes()) {
+ Resource rs = route.getSourceResource();
+ if (rs != null && rs.getLocation() != null) {
+ sources.add(FileUtil.stripPath(rs.getLocation()));
+ }
+ }
+ String data = null;
+ for (File file : changed) {
+ String name = file.getName();
+ if (name.endsWith(".properties") || name.endsWith(".java") || name.endsWith(".groovy")
+ || sources.contains(name)) {
+ return null;
Review Comment:
Good catch, fixed in 3d9dc19eaf34. The route sources are now compared by their full normalized path (from the `file:` location of each route's source resource), so `inbox/route.yaml` stays data when a route is loaded from `route.yaml`.
_Claude Code on behalf of @davsclaus._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25670: camel-jbang - camel run --data-dir for data folders that dev mode does not watch [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27847:
URL: https://github.com/apache/camel/pull/27847#issuecomment-6176218723
:star2: Thank you for your contribution to the Apache Camel project! :star2:
:robot: CI automation will test this PR automatically.
:camel: Apache Camel Committers, please review the following items:
* First-time contributors **require MANUAL approval** for the GitHub Actions to run
* You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
* You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
* Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
:warning: Be careful when sharing logs. Review their contents before sharing them publicly.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org