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

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

commit 2767db3a5d66c08eb392564935fd320ed9ab7fdb
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri May 29 10:57:11 2020 +0200

    CAMLE-15126: Make health-check able to resolve from classpath. And make a 
health check implementation by default enabled (was a bit awkward to both 
register and have to enable it afterwards).
---
 .../camel/health/HealthCheckConfiguration.java     |  2 +-
 .../apache/camel/health/HealthCheckRegistry.java   | 10 +++++
 .../services/org/apache/camel/context-health-check |  2 +
 .../camel/impl/health/ContextHealthCheck.java      |  2 +
 .../impl/health/DefaultHealthCheckRegistry.java    | 44 +++++++++++-----------
 .../health/DefaultHealthCheckRegistryTest.java     | 36 ++++++++++++++++--
 .../apache/camel/impl/health/HealthCheckTest.java  |  2 +
 .../camel/management/ManagedHealthCheckTest.java   | 18 +++++++++
 8 files changed, 91 insertions(+), 25 deletions(-)

diff --git 
a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
 
b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
index 91b4e35..8289dd6 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
@@ -23,7 +23,7 @@ import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.TimeUtils;
 
 public class HealthCheckConfiguration implements Cloneable {
-    public static final Boolean DEFAULT_VALUE_ENABLED = Boolean.FALSE;
+    public static final Boolean DEFAULT_VALUE_ENABLED = Boolean.TRUE;
     public static final Duration DEFAULT_VALUE_INTERVAL = Duration.ZERO;
     public static final Integer DEFAULT_VALUE_FAILURE_THRESHOLD = 0;
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java 
b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
index e20b784..e7998e7 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
@@ -39,6 +39,16 @@ public interface HealthCheckRegistry extends 
HealthCheckRepository, CamelContext
     String FACTORY = "health-check-registry";
 
     /**
+     * Resolves {@link HealthCheck} by id.
+     *
+     * Will first lookup in this {@link HealthCheckRegistry} and then {@link 
org.apache.camel.spi.Registry},
+     * and lastly do classpath scanning via {@link 
org.apache.camel.spi.annotations.ServiceFactory}.
+     * The classpath scanning is attempted first with id-health-check as the 
key, and then with id as fallback
+     * if not found the first time.
+     */
+    HealthCheck resolveHealthCheckById(String id);
+
+    /**
      * Registers a service {@link HealthCheck}.
      */
     boolean register(HealthCheck check);
diff --git 
a/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check
 
b/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check
new file mode 100644
index 0000000..5413a66
--- /dev/null
+++ 
b/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.health.ContextHealthCheck
diff --git 
a/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java
 
b/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java
index 764073b..52b26fe 100644
--- 
a/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java
+++ 
b/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java
@@ -21,11 +21,13 @@ import java.util.Map;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.health.HealthCheckResultBuilder;
+import org.apache.camel.spi.annotations.JdkService;
 
 /**
  * {@link org.apache.camel.health.HealthCheck} that checks the status of the 
{@link CamelContext} whether
  * its started or not.
  */
+@JdkService("context-health-check")
 public final class ContextHealthCheck extends AbstractHealthCheck implements 
CamelContextAware {
     private CamelContext camelContext;
 
diff --git 
a/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
 
b/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
index 8c91095..81750e4 100644
--- 
a/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
+++ 
b/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
@@ -24,10 +24,11 @@ import java.util.stream.Stream;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.health.HealthCheck;
-import org.apache.camel.health.HealthCheckConfiguration;
 import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
+import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.annotations.JdkService;
 import org.apache.camel.support.service.ServiceSupport;
 import org.slf4j.Logger;
@@ -43,7 +44,6 @@ public class DefaultHealthCheckRegistry extends 
ServiceSupport implements Health
     private final Set<HealthCheck> checks;
     private final Set<HealthCheckRepository> repositories;
     private CamelContext camelContext;
-    private boolean includeContextCheck = true;
 
     public DefaultHealthCheckRegistry() {
         this(null);
@@ -61,14 +61,6 @@ public class DefaultHealthCheckRegistry extends 
ServiceSupport implements Health
     protected void doInit() throws Exception {
         super.doInit();
 
-        // include the basic context check if not already present
-        if (checks.stream().noneMatch(ContextHealthCheck.class::isInstance)) {
-            ContextHealthCheck check = new ContextHealthCheck();
-            // and make it enabled
-            
check.setConfiguration(HealthCheckConfiguration.builder().enabled(true).build());
-            checks.add(check);
-        }
-
         for (HealthCheck check : checks) {
             if (check instanceof CamelContextAware) {
                 ((CamelContextAware) check).setCamelContext(camelContext);
@@ -86,17 +78,6 @@ public class DefaultHealthCheckRegistry extends 
ServiceSupport implements Health
     // Properties
     // ************************************
 
-    public boolean isIncludeContextCheck() {
-        return includeContextCheck;
-    }
-
-    /**
-     * Whether to automatic include the basic {@link ContextHealthCheck}.
-     */
-    public void setIncludeContextCheck(boolean includeContextCheck) {
-        this.includeContextCheck = includeContextCheck;
-    }
-
     @Override
     public final void setCamelContext(CamelContext camelContext) {
         this.camelContext = camelContext;
@@ -108,6 +89,27 @@ public class DefaultHealthCheckRegistry extends 
ServiceSupport implements Health
     }
 
     @Override
+    @SuppressWarnings("unchecked")
+    public HealthCheck resolveHealthCheckById(String id) {
+        HealthCheck answer =
+                checks.stream().filter(h -> h.getId().equals(id)).findFirst()
+                        
.orElse(camelContext.getRegistry().findByTypeWithName(HealthCheck.class).get(id));
+        if (answer == null) {
+            // discover via classpath (try first via -health-check and then id 
as-is)
+            FactoryFinder ff = 
camelContext.adapt(ExtendedCamelContext.class).getDefaultFactoryFinder();
+            Class<? extends HealthCheck> clazz = (Class<? extends 
HealthCheck>) ff.findOptionalClass(id + "-health-check").orElse(null);
+            if (clazz == null) {
+                clazz = (Class<? extends HealthCheck>) 
ff.findOptionalClass(id).orElse(null);
+            }
+            if (clazz != null) {
+                answer = camelContext.getInjector().newInstance(clazz);
+            }
+        }
+
+        return answer;
+    }
+
+    @Override
     public boolean register(HealthCheck check) {
         boolean result = checks.add(check);
         if (result) {
diff --git 
a/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java
 
b/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java
index efd6547..0ef6c7e 100644
--- 
a/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java
+++ 
b/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java
@@ -44,7 +44,6 @@ public class DefaultHealthCheckRegistryTest {
     @Test
     public void testDefaultHealthCheckRegistry() throws Exception {
         DefaultHealthCheckRegistry registry = new DefaultHealthCheckRegistry();
-        registry.setIncludeContextCheck(false);
         registry.register(new MyHealthCheck("G1", "1"));
         registry.register(new MyHealthCheck("G1", "1"));
         registry.register(new MyHealthCheck("G1", "2"));
@@ -65,7 +64,6 @@ public class DefaultHealthCheckRegistryTest {
     @Test
     public void testDefaultHealthCheckRegistryWithRepositories() throws 
Exception {
         DefaultHealthCheckRegistry registry = new DefaultHealthCheckRegistry();
-        registry.setIncludeContextCheck(false);
 
         registry.register(new MyHealthCheck("G1", "1"));
         registry.register(new MyHealthCheck("G1", "1"));
@@ -103,7 +101,39 @@ public class DefaultHealthCheckRegistryTest {
         registry.start();
 
         List<HealthCheck> checks = 
registry.stream().collect(Collectors.toList());
-        // should also include default
+        Assert.assertEquals(3, checks.size());
+
+        for (HealthCheck check : checks) {
+            HealthCheck.Result response = check.call();
+
+            Assert.assertEquals(HealthCheck.State.UP, response.getState());
+            Assert.assertFalse(response.getMessage().isPresent());
+            Assert.assertFalse(response.getError().isPresent());
+            Assert.assertSame(context, ((CamelContextAware) 
check).getCamelContext());
+        }
+    }
+
+    @Test
+    public void testResolveContextHealthCheck() throws Exception {
+        CamelContext context = new DefaultCamelContext();
+
+        HealthCheckRegistry registry = new DefaultHealthCheckRegistry();
+        registry.setCamelContext(context);
+        HealthCheck hc = registry.resolveHealthCheckById("context");
+        Assert.assertNotNull(hc);
+        Assert.assertEquals("camel", hc.getGroup());
+        Assert.assertEquals("context", hc.getId());
+        Assert.assertTrue(hc instanceof ContextHealthCheck);
+
+        registry.register(hc);
+        registry.register(new MyHealthCheck("G1", "1"));
+        registry.register(new MyHealthCheck("G1", "2"));
+        registry.register(new MyHealthCheck("G2", "3"));
+
+        context.start();
+        registry.start();
+
+        List<HealthCheck> checks = 
registry.stream().collect(Collectors.toList());
         Assert.assertEquals(4, checks.size());
 
         for (HealthCheck check : checks) {
diff --git 
a/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java
 
b/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java
index 923fd03..973d2a1 100644
--- 
a/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java
+++ 
b/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java
@@ -29,6 +29,8 @@ public class HealthCheckTest {
     public void testCheck() throws Exception {
         MyHealthCheck check = new MyHealthCheck();
         check.setState(HealthCheck.State.UP);
+        // disable
+        check.getConfiguration().setEnabled(false);
 
         HealthCheck.Result result;
 
diff --git 
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java
 
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java
index b8d05bb..9f332a7 100644
--- 
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java
+++ 
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java
@@ -22,11 +22,29 @@ import javax.management.openmbean.TabularData;
 
 import java.util.Collection;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckRegistry;
+import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
 import org.junit.Test;
 
 public class ManagedHealthCheckTest extends ManagementTestSupport {
 
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        // install health check manually
+        HealthCheckRegistry registry = new DefaultHealthCheckRegistry();
+        registry.setCamelContext(context);
+        HealthCheck hc = registry.resolveHealthCheckById("context");
+        registry.register(hc);
+        context.setExtension(HealthCheckRegistry.class, registry);
+
+        return context;
+    }
+
     @Test
     public void testHealthCheck() throws Exception {
         // JMX tests dont work well on AIX CI servers (hangs them)

Reply via email to