This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 6868630819e CAMEL-21120: camel-jbang - Reload with groovy code should 
flush cache script
6868630819e is described below

commit 6868630819e071391ce33f05450a728eacf9bc54
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Aug 30 17:06:50 2024 +0200

    CAMEL-21120: camel-jbang - Reload with groovy code should flush cache script
---
 .../camel/language/groovy/GroovyLanguage.java      | 32 +++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git 
a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
 
b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
index da3014c585c..430d776e84b 100644
--- 
a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
+++ 
b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
@@ -24,10 +24,13 @@ import groovy.lang.Binding;
 import groovy.lang.GroovyShell;
 import groovy.lang.Script;
 import org.apache.camel.Service;
+import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.LRUCacheFactory;
 import org.apache.camel.support.ObjectHelper;
+import org.apache.camel.support.SimpleEventNotifierSupport;
 import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.support.service.ServiceHelper;
 import org.codehaus.groovy.runtime.InvokerHelper;
@@ -46,6 +49,8 @@ public class GroovyLanguage extends TypedLanguageSupport 
implements ScriptingLan
      */
     private final Map<String, GroovyClassService> scriptCache;
 
+    private EventNotifier notifier;
+
     private GroovyLanguage(Map<String, GroovyClassService> scriptCache, 
boolean loadExternalResource) {
         this.scriptCache = scriptCache;
         this.loadExternalResource = loadExternalResource;
@@ -57,13 +62,38 @@ public class GroovyLanguage extends TypedLanguageSupport 
implements ScriptingLan
 
     @Override
     public void start() {
-        // noop
+        // are we in dev mode then support flushing cache on reload
+        if (getCamelContext() != null) {
+            String profile = 
getCamelContext().getCamelContextExtension().getProfile();
+            if ("dev".equals(profile)) {
+                if (notifier == null) {
+                    notifier = new ReloadNotifier();
+                    
getCamelContext().getManagementStrategy().addEventNotifier(notifier);
+                }
+            }
+        }
     }
 
     @Override
     public void stop() {
         ServiceHelper.stopService(scriptCache.values());
         scriptCache.clear();
+        if (notifier != null) {
+            
getCamelContext().getManagementStrategy().removeEventNotifier(notifier);
+            notifier = null;
+        }
+    }
+
+    private final class ReloadNotifier extends SimpleEventNotifierSupport {
+
+        @Override
+        public void notify(CamelEvent event) throws Exception {
+            // if context or route is reloading then clear cache to ensure old 
scripts are removed from memory.
+            if (event instanceof CamelEvent.CamelContextReloadingEvent || 
event instanceof CamelEvent.RouteReloadedEvent) {
+                ServiceHelper.stopService(scriptCache.values());
+                scriptCache.clear();
+            }
+        }
     }
 
     private static final class GroovyClassService implements Service {

Reply via email to