You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2022/08/01 14:24:08 UTC

[camel-k-runtime] branch main updated: Add preliminary support for the Resume API for Camel K

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

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k-runtime.git


The following commit(s) were added to refs/heads/main by this push:
     new 2ae1bd48 Add preliminary support for the Resume API for Camel K
2ae1bd48 is described below

commit 2ae1bd48b8f4a1bec99d346fef6ea6acceb27506
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Tue May 10 09:00:08 2022 +0200

    Add preliminary support for the Resume API for Camel K
    
    This includes a new customizer that handles setting up part of the
    resume API in the context.
---
 camel-k-resume-kafka/deployment/pom.xml            | 60 +++++++++++++++
 .../k/quarkus/resume/deployment/ResumeFeature.java | 30 ++++++++
 camel-k-resume-kafka/impl/pom.xml                  | 85 ++++++++++++++++++++
 .../camel/k/resume/ResumeContextCustomizer.java    | 90 ++++++++++++++++++++++
 .../camel/k/resume/kafka/KafkaResumeFactory.java   | 63 +++++++++++++++
 camel-k-resume-kafka/pom.xml                       | 38 +++++++++
 camel-k-resume-kafka/runtime/pom.xml               | 87 +++++++++++++++++++++
 pom.xml                                            |  2 +
 .../camel/k/tooling/maven/GenerateCatalogMojo.java | 13 ++++
 support/camel-k-runtime-bom/pom.xml                | 10 +++
 10 files changed, 478 insertions(+)

diff --git a/camel-k-resume-kafka/deployment/pom.xml b/camel-k-resume-kafka/deployment/pom.xml
new file mode 100644
index 00000000..1f1173c0
--- /dev/null
+++ b/camel-k-resume-kafka/deployment/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-resume-kafka-parent</artifactId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-k-resume-kafka-deployment</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-core-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-resume-kafka</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus-version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/camel-k-resume-kafka/deployment/src/main/java/org/apache/camel/k/quarkus/resume/deployment/ResumeFeature.java b/camel-k-resume-kafka/deployment/src/main/java/org/apache/camel/k/quarkus/resume/deployment/ResumeFeature.java
new file mode 100644
index 00000000..825f5236
--- /dev/null
+++ b/camel-k-resume-kafka/deployment/src/main/java/org/apache/camel/k/quarkus/resume/deployment/ResumeFeature.java
@@ -0,0 +1,30 @@
+/*
+ * 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.k.quarkus.resume.deployment;
+
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+
+public class ResumeFeature {
+    private static final String FEATURE = "camel-k-resume";
+
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
+}
diff --git a/camel-k-resume-kafka/impl/pom.xml b/camel-k-resume-kafka/impl/pom.xml
new file mode 100644
index 00000000..b8364ffc
--- /dev/null
+++ b/camel-k-resume-kafka/impl/pom.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-resume-kafka-parent</artifactId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-k-resume-kafka-impl</artifactId>
+
+
+    <dependencies>
+
+        <!-- ****************************** -->
+        <!--                                -->
+        <!-- RUNTIME                        -->
+        <!--                                -->
+        <!-- ****************************** -->
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-engine</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-core-support</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-apt</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- These provide the serializer -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-kafka</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.jboss.jandex</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/ResumeContextCustomizer.java b/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/ResumeContextCustomizer.java
new file mode 100644
index 00000000..b793423c
--- /dev/null
+++ b/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/ResumeContextCustomizer.java
@@ -0,0 +1,90 @@
+/*
+ * 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.k.resume;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.k.ContextCustomizer;
+import org.apache.camel.k.annotation.Customizer;
+import org.apache.camel.k.resume.kafka.KafkaResumeFactory;
+import org.apache.camel.resume.ResumeStrategy;
+import org.apache.camel.resume.cache.ResumeCache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Customizer("resume")
+public class ResumeContextCustomizer implements ContextCustomizer {
+    private static final Logger LOG = LoggerFactory.getLogger(ResumeContextCustomizer.class);
+    private String resumeStrategy;
+    private String resumeServer;
+    private String resumePath;
+    private String cacheFillPolicy;
+
+
+    @Override
+    public void apply(CamelContext camelContext) {
+        LOG.debug("Receiving context for customization");
+        LOG.debug("Resume strategy: {}", resumeStrategy);
+        LOG.debug("Resume server: {}", resumeServer);
+        LOG.debug("Resume path: {}", resumePath);
+        LOG.debug("Cache fill policy: {}", cacheFillPolicy);
+
+        ResumeCache<?> resumeCache = (ResumeCache<?>) camelContext.getRegistry().lookupByName("cache");
+        LOG.debug("Values from the registry (cache): {}", resumeCache);
+
+        try {
+            ResumeStrategy resumeStrategyInstance = KafkaResumeFactory.build(resumeStrategy, resumeServer, resumePath, cacheFillPolicy);
+
+            LOG.debug("Created resume strategy instance: {}", resumeStrategyInstance.getClass());
+            camelContext.getRegistry().bind("resumeStrategy", resumeStrategyInstance);
+        } catch (Exception e) {
+            LOG.error("Exception: {}", e.getMessage(), e);
+        }
+    }
+
+    public String getResumeStrategy() {
+        return resumeStrategy;
+    }
+
+    public void setResumeStrategy(String resumeStrategy) {
+        this.resumeStrategy = resumeStrategy;
+    }
+
+    public String getResumePath() {
+        return resumePath;
+    }
+
+    public void setResumePath(String resumePath) {
+        this.resumePath = resumePath;
+    }
+
+    public String getResumeServer() {
+        return resumeServer;
+    }
+
+    public void setResumeServer(String resumeServer) {
+        this.resumeServer = resumeServer;
+    }
+
+    public String getCacheFillPolicy() {
+        return cacheFillPolicy;
+    }
+
+    public void setCacheFillPolicy(String cacheFillPolicy) {
+        this.cacheFillPolicy = cacheFillPolicy;
+    }
+}
diff --git a/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/kafka/KafkaResumeFactory.java b/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/kafka/KafkaResumeFactory.java
new file mode 100644
index 00000000..d2ce1a63
--- /dev/null
+++ b/camel-k-resume-kafka/impl/src/main/java/org/apache/camel/k/resume/kafka/KafkaResumeFactory.java
@@ -0,0 +1,63 @@
+/*
+ * 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.k.resume.kafka;
+
+import org.apache.camel.processor.resume.kafka.KafkaResumeStrategyConfiguration;
+import org.apache.camel.processor.resume.kafka.KafkaResumeStrategyConfigurationBuilder;
+import org.apache.camel.processor.resume.kafka.MultiNodeKafkaResumeStrategy;
+import org.apache.camel.processor.resume.kafka.SingleNodeKafkaResumeStrategy;
+import org.apache.camel.resume.Cacheable;
+import org.apache.camel.resume.ResumeStrategy;
+import org.apache.camel.util.ObjectHelper;
+
+public final class KafkaResumeFactory {
+
+    private KafkaResumeFactory() {
+
+    }
+
+    public static ResumeStrategy build(String name, String resumeServer, String topic, String cacheFillPolicy) {
+        Cacheable.FillPolicy policy = extracted(cacheFillPolicy);
+
+        final KafkaResumeStrategyConfiguration resumeStrategyConfiguration = KafkaResumeStrategyConfigurationBuilder.newBuilder()
+                .withBootstrapServers(resumeServer)
+                .withCacheFillPolicy(policy)
+                .withTopic(topic)
+                .build();
+
+        switch (name) {
+            case "org.apache.camel.processor.resume.kafka.SingleNodeKafkaResumeStrategy": {
+                return new SingleNodeKafkaResumeStrategy<>(resumeStrategyConfiguration);
+            }
+            case "org.apache.camel.processor.resume.kafka.MultiNodeKafkaResumeStrategy": {
+                return new MultiNodeKafkaResumeStrategy<>(resumeStrategyConfiguration);
+            }
+            default: {
+                throw new UnsupportedOperationException(String.format("The strategy %s is not a valid strategy", name));
+            }
+        }
+    }
+
+    private static Cacheable.FillPolicy extracted(String cacheFillPolicy) {
+        if (!ObjectHelper.isEmpty(cacheFillPolicy) && cacheFillPolicy.equals("minimizing")) {
+            return Cacheable.FillPolicy.MINIMIZING;
+        }
+
+        return Cacheable.FillPolicy.MAXIMIZING;
+    }
+}
diff --git a/camel-k-resume-kafka/pom.xml b/camel-k-resume-kafka/pom.xml
new file mode 100644
index 00000000..65cd2a4d
--- /dev/null
+++ b/camel-k-resume-kafka/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-runtime-project</artifactId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>pom</packaging>
+
+    <artifactId>camel-k-resume-kafka-parent</artifactId>
+
+    <modules>
+        <module>impl</module>
+        <module>runtime</module>
+        <module>deployment</module>
+    </modules>
+
+</project>
diff --git a/camel-k-resume-kafka/runtime/pom.xml b/camel-k-resume-kafka/runtime/pom.xml
new file mode 100644
index 00000000..bfb9263e
--- /dev/null
+++ b/camel-k-resume-kafka/runtime/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-resume-kafka-parent</artifactId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-k-resume-kafka</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-resume-kafka-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bootstrap-maven-plugin</artifactId>
+                <version>${quarkus-version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>extension-descriptor</goal>
+                        </goals>
+                        <configuration>
+                            <deployment>${project.groupId}:${project.artifactId}-deployment:${project.version}</deployment>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus-version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.jboss.jandex</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/pom.xml b/pom.xml
index 85313b20..139ceaaa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,10 +376,12 @@
         <module>camel-k-master</module>
         <module>camel-k-webhook</module>
         <module>camel-k-runtime</module>
+        <module>camel-k-resume-kafka</module>
 
         <module>itests</module>
         <module>examples</module>
         <module>distribution</module>
+
     </modules>
 
     <dependencyManagement>
diff --git a/support/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/GenerateCatalogMojo.java b/support/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/GenerateCatalogMojo.java
index 6cf48167..4c30700f 100644
--- a/support/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/GenerateCatalogMojo.java
+++ b/support/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/GenerateCatalogMojo.java
@@ -240,6 +240,19 @@ public class GenerateCatalogMojo extends AbstractMojo {
                         .build()
                 );
             }
+            if (capabilitiesExclusionList != null && !capabilitiesExclusionList.contains("resume-kafka")) {
+                runtimeSpec.putCapability(
+                        "resume-kafka",
+                        CamelCapability.forArtifact(
+                                "org.apache.camel.k", "camel-k-resume-kafka"));
+
+                catalogSpec.putArtifact(
+                        new CamelArtifact.Builder()
+                                .groupId("org.apache.camel.k")
+                                .artifactId("camel-k-resume-kafka")
+                                .build()
+                );
+            }
 
             catalogSpec.runtime(runtimeSpec.build());
 
diff --git a/support/camel-k-runtime-bom/pom.xml b/support/camel-k-runtime-bom/pom.xml
index 4f2a9cd1..04726158 100644
--- a/support/camel-k-runtime-bom/pom.xml
+++ b/support/camel-k-runtime-bom/pom.xml
@@ -204,6 +204,16 @@
                 <artifactId>camel-k-maven-plugin</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-resume-impl</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-resume</artifactId>
+                <version>${project.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>