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

commit e16645b9605f0284d1d04479647a1443f0a0ba16
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Sep 8 12:33:01 2022 +0200

    camel-core - Trigger CamelContextReloadFailure when context failed reload.
---
 .../main/java/org/apache/camel/spi/CamelEvent.java |  8 ++++
 .../java/org/apache/camel/spi/EventFactory.java    | 10 +++++
 .../impl/engine/DefaultContextReloadStrategy.java  |  1 +
 .../impl/event/CamelContextReloadFailureEvent.java | 52 ++++++++++++++++++++++
 .../camel/impl/event/DefaultEventFactory.java      |  9 ++++
 .../java/org/apache/camel/support/EventHelper.java | 39 ++++++++++++++++
 6 files changed, 119 insertions(+)

diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
index 5bc7335df53..fb65ea9046a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
@@ -43,6 +43,7 @@ public interface CamelEvent {
         CamelContextSuspending,
         CamelContextReloading,
         CamelContextReloaded,
+        CamelContextReloadFailure,
         ExchangeCompleted,
         ExchangeCreated,
         ExchangeFailed,
@@ -236,6 +237,13 @@ public interface CamelEvent {
         }
     }
 
+    interface CamelContextReloadFailureEvent extends CamelContextEvent, 
FailureEvent {
+        @Override
+        default Type getType() {
+            return Type.CamelContextReloadFailure;
+        }
+    }
+
     interface ExchangeEvent extends CamelEvent {
 
         Exchange getExchange();
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
index 8def996a578..bca9024b6dd 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
@@ -155,6 +155,16 @@ public interface EventFactory {
      */
     CamelEvent createCamelContextReloaded(CamelContext context, Object source);
 
+    /**
+     * Creates an {@link CamelEvent} for {@link CamelContext} failed reload.
+     *
+     * @param  context camel context
+     * @param  source  the source triggered reload
+     * @param  cause   the caused of the failure
+     * @return         the reloaded failed event
+     */
+    CamelEvent createCamelContextReloadFailure(CamelContext context, Object 
source, Throwable cause);
+
     /**
      * Creates an {@link CamelEvent} for a Service failed to start cleanly
      *
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextReloadStrategy.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextReloadStrategy.java
index 35124612263..0fd69afb62e 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextReloadStrategy.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextReloadStrategy.java
@@ -58,6 +58,7 @@ public class DefaultContextReloadStrategy extends 
ServiceSupport implements Cont
         } catch (Exception e) {
             incFailedCounter();
             LOG.warn("Error reloading CamelContext (" + camelContext.getName() 
+ ") due to: " + e.getMessage(), e);
+            EventHelper.notifyContextReloadFailure(getCamelContext(), source, 
e);
         }
     }
 
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextReloadFailureEvent.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextReloadFailureEvent.java
new file mode 100644
index 00000000000..5f81475ebd2
--- /dev/null
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextReloadFailureEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextReloadFailureEvent extends AbstractContextEvent
+        implements CamelEvent.CamelContextReloadFailureEvent {
+
+    private static final long serialVersionUID = 7966471393751298720L;
+
+    private final Object action;
+    private final Throwable cause;
+
+    public CamelContextReloadFailureEvent(CamelContext context, Object action, 
Throwable cause) {
+        super(context);
+        this.action = action;
+        this.cause = cause;
+    }
+
+    @Override
+    public Throwable getCause() {
+        return cause;
+    }
+
+    /**
+     * The action which triggered reloading
+     */
+    public Object getAction() {
+        return action;
+    }
+
+    @Override
+    public String toString() {
+        return "Failed to reload CamelContext: " + getContext().getName() + " 
due to " + cause.getMessage();
+    }
+}
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
index a06564e8fcc..98cb27af552 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
@@ -159,6 +159,15 @@ public class DefaultEventFactory implements EventFactory {
         return answer;
     }
 
+    @Override
+    public CamelEvent createCamelContextReloadFailure(CamelContext context, 
Object source, Throwable cause) {
+        CamelEvent answer = new CamelContextReloadFailureEvent(context, 
source, cause);
+        if (timestampEnabled) {
+            answer.setTimestamp(System.currentTimeMillis());
+        }
+        return answer;
+    }
+
     @Override
     public CamelEvent createCamelContextReloaded(CamelContext context, Object 
source) {
         CamelEvent answer = new CamelContextReloadedEvent(context, source);
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
index a127d8a7ecc..07b62e54948 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
@@ -579,6 +579,45 @@ public final class EventHelper {
         return answer;
     }
 
+    public static boolean notifyContextReloadFailure(CamelContext context, 
Object source, Throwable cause) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getStartedEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreRouteEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextReloadFailure(context, 
source, cause);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
     public static boolean notifyExchangeCreated(CamelContext context, Exchange 
exchange) {
         ManagementStrategy management = context.getManagementStrategy();
         if (management == null) {

Reply via email to