Hi You can implement a custom org.apache.camel.spi.ResourceReload where you in the onReload can program what to do. The current defauly just do
if (name.endsWith(".properties")) { onPropertiesReload(resource, true); } else { onRouteReload(List.of(resource), false); } And then create an instance of FileWatcherResourceReloadStrategy which you can configure with folder / pattern etc, and then add this as a bean to camel context. On Thu, May 18, 2023 at 9:39 AM Fyodor Kravchenko <feddkr...@hotmail.com> wrote: > Hi, > > Thank you! I'm new to the Camel 3 API, can you please point me how can I > load a route programmatically if I have a yaml or xml String (or > Stream/Reader)? > > Regarding the ticket, loading the new files after the startup, renaming > the route files and deleting them would also be a useful development > feature. Currently it works independently from the initial load, so it > does re-load all of the routes it encounters under the base directory, > but the pattern it uses to choose which files to (re/un)load follows the > different syntax and even the directory base is different. > > A jira ticket that I would file would require a developer-friendly > "fileReload"-true-false configuration parameter, that would try to use > the same pattern that the "include" configuration uses, if it is a > "file" one. I can imagine it is not a trivial development for a rarely > used development feature and is likely to be marked as "will not > implement" so let's leave it as it is. > > On 18.05.2023 09:06, Claus Ibsen wrote: > > On Wed, May 17, 2023 at 10:59 PM Fyodor Kravchenko < > feddkr...@hotmail.com> > > wrote: > > > >> Hi, > >> > >> I'm integrating Camel into my application, or better say, application > >> platform, that may run different arbitrary Camel routes for integration, > >> and I'd like to provide an ability for a developer who makes > >> applications for this platform to edit the routes during the > >> development. I'm already monitoring the filesystem for other artifact > >> edits, so If there is an API to reload an individual route taken from a > >> file I might use that. > >> > >> I've considered to use a separate Camel standalone or as a containerized > >> service that I've noticed the project is encouraging now, but this would > >> require me to develop some protocol to interact with my platform during > >> its lifecycle. For Camel 2 I managed to instantiate xml snippets to > >> custom Processors but the API has changed and this Main load-reload > >> function seemed to do what I want for Camel 3. > >> > >> > > Okay so for making the reload respect only already loaded files, then we > > can match the "changed file event" form the JDK > > and match if it was previously loaded or not. And then skip it if not. > > > > Then users can turn this on via some new option (maybe name it only > > existing files, or some better name? ). > > withRoutesReloadOnlyExistingFiles(true) > > > > > > You are welcome to create a JIRA ticket for that. > > > > > > > >> On 17.05.2023 22:58, Claus Ibsen wrote: > >>> Hi > >>> > >>> What is your goal with this? > >>> > >>> The reload stuff is for development and not a production app server to > >>> "redeploy apps" or any sort of that. > >>> The intention is that you work on a single application. > >>> > >>> The reload is using Java APIs for "change file events" and this does > not > >>> support an ANT style way and whatnot. > >>> > >>> > >>> On Wed, May 17, 2023 at 8:45 PM Fyodor Kravchenko < > feddkr...@hotmail.com > >>> > >>> wrote: > >>> > >>>> I'm sorry please disregard my previous ramblings, moving the "deploy" > >>>> directory to the working directory of the java app did the "include" > >>>> trick. It worked without the "file:" prefix because it was looking > into > >>>> the "target" directry which was the classpath.. My fault. > >>>> > >>>> However, the additional question remains: how do I make it _reload_ > what > >>>> it loaded previosly, without catching the extra *.yaml files that may > be > >>>> located in the wrong directories? > >>>> > >>>> I'm trying this, > >>>> > >>>> Main main = new Main(); > >>>> > >>>> > >> > main.configure().withRoutesIncludePattern("file:deploy/**/PRIVATE/EXCHANGE/*.yaml"); > >>>> main.configure().withRoutesReloadEnabled(true); > >>>> main.configure().withRoutesReloadDirectory("deploy"); > >>>> main.configure().withRoutesReloadDirectoryRecursive(true); > >>>> // > >> main.configure().withRoutesReloadPattern("**/PRIVATE/EXCHANGE/*.yaml"); > >>>> // > main.configure().withRoutesReloadPattern("PRIVATE/EXCHANGE/*.yaml"); > >>>> main.configure().withRoutesReloadPattern("*.yaml"); > >>>> main.configure().withRoutesReloadRemoveAllRoutes(true); > >>>> main.run(); > >>>> > >>>> but this will catch and load any .yaml file under the "deploy" > >>>> directory, event those that wasn't loaded at startup, when I touch any > >>>> of the yamls. > >>>> > >>>> Any tips on reloading patterns? > >>>> > >>>> Thank you! > >>>> > >>>> On 17.05.2023 21:06, Fyodor Kravchenko wrote: > >>>>> Hi, thanks but this > >>>>> > >>>>> ............................. > >>>>> Netbeans uses the following command to run the program: > >>>>> > >>>>> cd /home/fedd/NetBeansProjects/camelmaintry; > >>>>> JAVA_HOME=/home/fedd/Programs/graalvm-ce-java19-22.3.0 > >>>>> /snap/netbeans/76/netbeans/java/maven/bin/mvn -Dexec.vmArgs= > >>>>> "-Dexec.args=${exec.vmArgs} -classpath %classpath ${exec.mainClass} > >>>>> ${exec.appArgs}" -Dexec.appArgs= > >>>>> -Dexec.mainClass=camelmaintry.CamelMainTry > >>>>> > -Dexec.executable=/home/fedd/Programs/graalvm-ce-java19-22.3.0/bin/java > >>>>> org.codehaus.mojo:exec-maven-plugin:3.1.0:exec > >>>>> > >>>>> (nothing special in the "exec.mainClass" and other placeholders > there) > >>>>> > >>>>> I can't grasp how to make it look into this pattern: > >>>>> > >>>>> deploy/**/PRIVATE/EXCHANGE/*.yaml > >>>>> > >>>>> Thanks! > >>>>> --fedd > >>>>> > >>>>> On 17.05.2023 20:15, Claus Ibsen wrote: > >>>>>> Hi > >>>>>> > >>>>>> Okay for file system, you should favour prefixing with file: > >>>>>> > >>>>>> > >> > main.configure().withRoutesIncludePattern("file:deploy/customer/PRIVATE/EXCHANGE/*.yaml"); > >>>>>> > >>>>>> On Wed, May 17, 2023 at 3:53 PM Fyodor Kravchenko > >>>>>> <feddkr...@hotmail.com> > >>>>>> wrote: > >>>>>> > >>>>>>> Hi, > >>>>>>> > >>>>>>> I'm trying to load the routes from the file system directly, it's > >> Camel > >>>>>>> 3.20.4, and it's java 19 from the GraalVM distribution running on > >>>>>>> Ubuntu > >>>>>>> 22.04. The fact it sees the file when no wildcard is present tells > me > >>>>>>> that I'm missing something in the wildcards and the docs. > >>>>>>> > >>>>>>> Thank you! > >>>>>>> > >>>>>>> --fedd > >>>>>>> > >>>>>>> (sorry for the late response, only now I've got the rejection > >>>>>>> notification for the html-formatted email) > >>>>>>> > >>>>>>> On 15.05.2023 11:01, Claus Ibsen wrote: > >>>>>>>> Hi > >>>>>>>> > >>>>>>>> Are you loading these files from classpath or file system > directly. > >>>>>>>> And what Camel version do you use > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> On Sun, May 14, 2023 at 5:39 PM Fyodor Kravchenko > >>>>>>>> <feddkr...@hotmail.com > >>>>>>>> > >>>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Hello, > >>>>>>>>> > >>>>>>>>> in my little test I'm trying the following, > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> public class CamelMainTry { > >>>>>>>>> public static void main(String[] args) throws Exception > { > >>>>>>>>> Main main = new Main(); > >>>>>>>>> // this works but I need to catch more > >>>>>>>>> // > >>>>>>>>> > >>>>>>>>> > >> > main.configure().withRoutesIncludePattern("deploy/customer/PRIVATE/EXCHANGE/*.yaml"); > >>>>>>>>> // these don't work:' > >>>>>>>>> // > >>>>>>>>> > >>>>>>>>> > >> > main.configure().withRoutesIncludePattern("deploy/**/PRIVATE/EXCHANGE/*.yaml"); > >>>> > >> > main.configure().withRoutesIncludePattern("deploy/*/PRIVATE/EXCHANGE/*.yaml"); > >>>>>>>>> main.run(); > >>>>>>>>> } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> my files are located: > >>>>>>>>> > >>>>>>>>> deploy/customer/PRIVATE/EXCHANGE/cust.yaml > >>>>>>>>> > >>>>>>>>> deploy/register/bank/PRIVATE/EXCHANGE/reg.yaml > >>>>>>>>> > >>>>>>>>> So there could be more directories in the middle; however it > >> doesn't > >>>>>>>>> substitute even one. > >>>>>>>>> > >>>>>>>>> The Ant-style (or what I'm thinking the Ant style) pattern > doesn't > >>>>>>>>> seem > >>>>>>>>> to catch multiple directories. If I specify the directory > >>>>>>>>> explicitly it > >>>>>>>>> works, but I need it to locate the routes in dozens of > directories. > >>>>>>>>> > >>>>>>>>> How do I fix it? > >>>>>>>>> > >>>>>>>>> (While we're at it I would also like to make it reload on the fly > >> for > >>>>>>>>> the testing purposes, not all of the .yaml files but restricting > >>>>>>>>> it to > >>>>>>>>> my directory structure) > >>>>>>>>> > >>>>>>>>> Thanks! > >>>>>>>>> > >>>>>>>>> --fedd > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > > > -- Claus Ibsen ----------------- @davsclaus Camel in Action 2: https://www.manning.com/ibsen2