迁移指南 Camel K 到 Camel Extensions for Quarkus


Red Hat build of Apache Camel K 1.10.7

从 Camel K 迁移到 Camel Extensions for Quarkus

摘要

本指南提供从 Camel K 迁移到 Camel Extensions for Quarkus 的详情。

前言

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 概述

Camel K 设置为弃用,而是使用统一的 Camel 方法进行 OpenShift。以 Red Hat Build of Camel for Quarkus 为目标,我们的目标是为现有客户提供迁移路径,以转换其 Camel K 集成。这种方法可确保无缝迁移到 Apache Camel for Quarkus 的红帽构建,在考虑 Camel K 支持的功能和红帽构建的 Apache Camel for Quarkus 时,需要最少的工作。

您必须了解构建、配置、部署和运行应用程序的 Quarkus 方法。

1.1. 假设

  • 要迁移所需的源文件位于 java、xml 或 yaml 中。
  • 要部署的目标系统是一个 OpenShift Cluster 4.15+。
  • Camel K 版本为 1.10.7。
  • 迁移是红帽构建的 Apache Camel for Quarkus。

Camel K 操作使用 Kamel CLI 运行集成,而 Camel K Operator 则管理并部署为运行的 pod 以及各种 Kubernetes 对象,包括 Deployment、Service、Route、ConfigMap、Secret 和 Knative。

注意

运行的 java 程序是 Camel on Quarkus 应用程序。

当使用红帽构建的 Apache Camel for Quarkus 时,起点是一个 Maven 项目,其中包含构建和运行集成所需的所有工件。此项目将包括 Deployment、Service、ConfigMap 和其他资源,虽然它们的配置可能与 Camel K 中的配置不同。例如,属性可能会存储在 application.properties 文件中,并且 Knative 配置可能需要单独的文件。主要目标是确保集成路由已在 OpenShift 集群中部署并运行。

1.1.1. 要求

要执行迁移,需要遵循一组工具和配置。

探索有关红帽构建的 Apache Camel 支持的配置组件详情

1.1.2. 超出范围

  • 使用 Camel Spring Boot (CSB)作为目标。迁移路径类似,但应该针对 CSB 和 JKube 进行定制。有关 许多示例 请参阅文档
  • OpenShift 管理.
  • 自定义 maven 项目.

1.1.3. 使用案例

Camel K 集成可能会有所不同,通常由几个与集成路由和配置对应的文件组成。集成路由可以在 Java、XML 或 YAML 中定义,而配置可以在属性文件或 kamel run 命令中指定。此迁移文档解决 ConfigMap 中涉及 KameletBinding、Kamelet、Knative 和属性的用例。

1.1.4. 版本

注意

Camel K 1.10.7 使用红帽构建的 Apache Camel for Quarkus 的不同 Camel 和 Quarkus 版本。

表 1.1. Camel K
工件Camel KRed Hat build of Apache Camel for Quarkus

JDK

11

21 (首选)、17 (支持)

Camel

3.18.6.redhat-00009

4.4.0.redhat-00025

Camel for Quarkus

2.13.3.redhat-00011

3.8.0.redhat-00006

Quarkus 平台

2.13.9.SP2-redhat-00003

3.8.5.redhat-00003

kamelet Catalog

1.10.7

2.3.x

从 Camel K 迁移到 Apache Camel for Quarkus 构建同时更新多个库。因此,由于底层库的不同,在构建或运行 Apache Camel for Quarkus 中的集成时可能会遇到一些错误。

1.1.5. 项目和机构

Camel K 集成路由源自 java、yaml 或 xml 中的单个文件。没有项目的概念来组织依赖项和构建。结束时,每个 kamel run <my app&gt; 都会产生一个正在运行的 pod。

红帽构建的 Apache Camel 需要一个 maven 项目。使用 camel export <many files& gt; 来生成 maven 项目。在构建项目时,容器镜像包含项目中定义的所有集成路由。

如果需要每个集成路由有一个 pod,您必须为每个集成路由创建一个 maven 项目。虽然有许多复杂方法,使用带有多个集成路由和自定义构建的单一 maven 项目来生成容器镜像来启动 pod,但这超出了此迁移指南的范围。

1.2. 遍历

Camel K 中的特征为 operator 提供了一种简单的方法,从 kamel cli 化参数到 kubernetes 对象和配置。Camel K 1.10 中只支持几个特征,在此迁移路径中涵盖这些特征。不需要涵盖以下特征的迁移路径中的配置: camel, platform, deployment, dependencies, deployer, openapi。

以下列表包含其参数的特征,以及 Red Hat build of Apache Camel for Quarkus 中的等效项。

注意

红帽构建的 Apache Camel for Quarkus 的属性必须在 application.properties 中设置。在构建项目时,位于 target/kubernetes/openshift.yml 中的 kubernetes 必须包含属性。

有关属性的更多信息,请参阅 Quarkus OpenShift Extension

表 1.2. builder Trait
遍历参数Quarkus 参数

builder.properties

将属性添加到 application.properties

表 1.3. 容器 Trait
遍历参数Quarkus 参数

container.expose

Service kubernetes 对象会自动创建。

container.image

Quarkus 中没有替换,因为此属性用于无源 Camel K 集成,红帽构建的 Apache Camel for Quarkus 中不被支持。

container.limit-cpu

quarkus.openshift.resources.limits.cpu

container.limit-memory

quarkus.openshift.resources.limits.memory

container.liveness-failure-threshold

quarkus.openshift.liveness-probe.failure-threshold

container.liveness-initial-delay

quarkus.openshift.liveness-probe.initial-delay

container.liveness-period

quarkus.openshift.liveness-probe.period

container.liveness-success-threshold

quarkus.openshift.liveness-probe.success-threshold

container.liveness-timeout

quarkus.openshift.liveness-probe.timeout

container.name

quarkus.openshift.container-name

container.port

quarkus.openshift.ports."<port name>".container-port

container.port-name

在属性名称中设置端口名称。语法为: quarkus.openshift.ports."<port name>".container-porthttps 端口的示例为 quarkus.openshift.ports.https.container-port

container.probes-enabled

将 quarkus maven 依赖项添加到 pom.xml

  <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
  </dependency>

它还会将启动探测添加到容器。请注意,延迟、超时和周期值可能会有所不同。

container.readiness-failure-threshold

quarkus.openshift.readiness-probe.failure-threshold

container.readiness-initial-delay

quarkus.openshift.readiness-probe.initial-delay

container.readiness-period

quarkus.openshift.readiness-probe.period

container.readiness-success-threshold

quarkus.openshift.readiness-probe.success-threshold

container.readiness-timeout

quarkus.openshift.readiness-probe.timeout

container.request-cpu

quarkus.openshift.resources.requests.cpu

container.request-memory

quarkus.openshift.resources.requests.memory

container.service-port

quarkus.openshift.ports.<port-name>.host-port

container.service-port-name

在属性名称中设置端口名称。语法为: quarkus.openshift.ports."<port name>".host-porthttps 端口的示例为 quarkus.openshift.ports.https.host-port

另外,请确保将路由端口名称设置为 quarkus.openshift.route.target-port

表 1.4. 环境垃圾
遍历参数Quarkus 参数

environment.vars

quarkus.openshift.env.vars.<key>=<value>

environment.http-proxy

您必须使用以下值设置代理主机: quarkus.kubernetes-client.http-proxyquarkus.kubernetes-client.https-proxyquarkus.kubernetes-client.no-proxy

表 1.5. 错误处理程序垃圾
遍历参数Quarkus 参数

error-handler.ref

您必须在集成路由中手动添加 Error Handler

表 1.6. JVM Trait
遍历参数Quarkus 参数

jvm.debug

quarkus.openshift.remote-debug.enabled

jvm.debug-suspend

quarkus.openshift.remote-debug.suspend

jvm.print-command

没有替换。

jvm.debug-address

quarkus.openshift.remote-debug.address-port

jvm.options

编辑 src/main/docker/Dockerfile.jvm,并更改 JAVA_OPTS 值来设置所需的值。

将 camel 日志级别增加到 debug 的示例:

ENV JAVA_OPTS="$JAVA_OPTS -Dquarkus.log.category.\"org.apache.camel\".level=debug"

注: Docker 配置依赖于基础镜像,OpenJDK 21 的配置

jvm.classpath

您必须在 maven 项目上设置 classpath,因此依赖项的完整列表将在 target/quarkus-app/ 及之后的版本中打包到 containster 镜像中。

表 1.7. 节点关联性垃圾箱
遍历参数Quarkus 参数
affinity.pod-affinity
affinity.pod-affinity-labels
affinity.pod-anti-affinity
affinity.pod-anti-affinity-labels
affinity.node-affinity-labels

Quarkus 中没有 关联性 配置。

表 1.8. 所有者 Trait
遍历参数Quarkus 参数

owner.enabled

Quarkus 中没有 所有者 配置。

表 1.9. Quarkus Trait
遍历参数Quarkus 参数

quarkus.package-type

对于原生构建,可使用 -Dnative

表 1.10. Knative Trait
遍历参数Quarkus 参数

knative.enabled

将 maven 依赖项 org.apache.camel.quarkus:camel-quarkus-knative 添加到 pom.xml 中,并设置以下属性:

quarkus.kubernetes.deployment-target=knative
quarkus.container-image.group=<group-name>
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000

quarkus maven 插件需要 quarkus.container-image SetConfiguration 属性来设置生成的 knative.yml 中的镜像 url。

knative.configuration

camel.component.knative.environmentPath

knative.channel-sources

在 knative.json 中配置。

knative.channel-sinks

在 knative.json 中配置。

knative.endpoint-sources

在 knative.json 中配置。

knative.endpoint-sinks

在 knative.json 中配置。

knative.event-sources

在 knative.json 中配置。

knative.event-sinks

在 knative.json 中配置。

knative.filter-source-channels

在 knative.json 中配置。

knative.sink-binding

没有替换,您必须创建 SinkBinding 对象。

knative.auto

没有替换。

knative.namespace-label

您必须将标签 bindings.knative.dev/include=true 手动设置为所需的命名空间。

表 1.11. Knative Service Trait
遍历参数Quarkus 参数

knative-service.enabled

quarkus.kubernetes.deployment-target=knative

knative-service.annotations

quarkus.knative.annotations.<annotation-name>=<value>

knative-service.autoscaling-class

quarkus.knative.revision-auto-scaling.auto-scaler-class

knative-service.autoscaling-metric

quarkus.knative.revision-auto-scaling.metric

knative-service.autoscaling-target

quarkus.knative.revision-auto-scaling.target

knative-service.min-scale

quarkus.knative.min-scale

knative-service.max-scale

quarkus.knative.max-scale

knative-service.rollout-duration

quarkus.knative.annotations."serving.knative.dev/rollout-duration"

knative-service.visibility

quarkus.knative.labels."networking.knative.dev/visibility" 它必须采用引号。

knative-service.auto

红帽构建的 Apache Camel for Quarkus 中不需要此行为。

表 1.12. Prometheus Trait
遍历参数Quarkus 参数

prometheus.enabled

将以下 maven 依赖项添加到 pom.xml

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-micrometer</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>

注: Camel K 创建一个 PodMonitor 对象,而 Quarkus 会创建一个 ServiceMonitor 对象,它们都正确来配置监控功能。

prometheus.pod-monitor

quarkus.openshift.prometheus.generate-service-monitor

prometheus.pod-monitor-labels

没有可用于设置自定义标签的 quarkus 属性,但您可以在部署前在 target/kubernetes/openshift.yml 中配置 ServiceMonitor 对象中的标签。

表 1.13. PodDisruptionBudget (PDB) Trait
遍历参数Quarkus 参数
pdb.enabled
pdb.min-available
pdb.max-unavailable

PodDisruptionBudget 对象没有 Quarkus 配置。

表 1.14. Pull Secret Trait
遍历参数Quarkus 参数

pull-secret.secret-name

quarkus.openshift.image-pull-secrets

表 1.15. 路由垃圾
遍历参数Quarkus 参数

route.enabled

quarkus.openshift.route.expose

route.annotations

quarkus.openshift.route.annotations.<key>=<value

route.host

quarkus.openshift.route.host

route.tls-termination

quarkus.openshift.route.tls.termination

route.tls-certificate

quarkus.openshift.route.tls.certificate

route.tls-certificate-secret

没有 quarkus 属性从 secret 读取证书。

route.tls-key

quarkus.openshift.route.tls.key

route.tls-key-secret

没有从 secret 读取密钥的 quarkus 属性。

route.tls-ca-certificate

quarkus.openshift.route.tls.ca-certificate

route.tls-ca-certificate-secret

没有 quarkus 属性从 secret 读取 CA 证书。

route.tls-destination-ca-certificate

quarkus.openshift.route.tls.destination-ca-certificate

route.tls-destination-ca-certificate-secret

没有从 secret 读取目标证书的 quarkus 属性。

route.tls-insecure-edge-termination-policy

quarkus.openshift.route.tls.insecure-edge-termination-policy

表 1.16. 服务 Trait
遍历参数Quarkus 参数

service.enabled

Service kubernetes 对象会自动创建。要禁用它,您必须在部署前从 target/kubernetes/openshift.yml 中删除 kind: Service

1.3. kamel run 配置

以下列出的 kamel run 命令中有一个额外的配置参数,以及它们在红帽构建的 Apache Camel for Quarkus 中对应的配置参数,它们必须添加到 src/main/resources/application.propertiespom.xml 中。

kamel run 参数Quarkus 参数

--annotation

quarkus.openshift.annotations.<annotation-name>=<value>

--build-property

pom.xml<properties > 标签中添加 属性。

--dependency

pom.xml 中添加依赖项。

--env

quarkus.openshift.env.vars.<env-name>=<value>

--label

quarkus.openshift.labels.<label-name>=<value>

--maven-repository

pom.xml 中添加存储库,或使用 camel export --repos=<my repo& gt;。

--logs

oc logs -f `oc get pod -l app.kubernetes.io/name=<artifact name> -oname`

--volume

quarkus.openshift.mounts.<my-volume>.path=</where/to/mount>

1.4. kamelets, KameletBindings 和 Pipes

Camel K Operator 捆绑 Kamelets,并将其安装为 kubernetes 对象。对于红帽构建的 Apache Camel for Quarkus 项目,您必须在 maven 项目中管理 kamelets yaml 文件。

管理 kamelets yaml 文件的方法有两种。

  1. kamelets 被打包并发布为 maven 工件 org.apache.camel.kamelets:camel-kameletshttps://github.com/apache/camel-kamelets您可以将这个依赖项添加到 pom.xml 中,并在 camel 路由启动时,它会在 classpath 中从该 jar 文件中加载 kamelet yaml 文件。

有开源 kamelet 和由红帽生成的,其工件后缀为 redhat-000nnn。例如:'1.10.7.redhat-00015'。它们可从 红帽 maven 存储库获取

2. 将 kamelet yaml 文件添加到 src/main/resources/kamelets 目录中,稍后被打包在最终的可部署工件中。不要在 pom.xml 中声明 org.apache.camel.kamelets:camel-kamelets。这样,camel 路由会从打包的项目加载 Kamelet yaml 文件。

KameletBinding 被重命名为 Pipe。因此,请考虑了解用例 3。虽然 kubernetes 资源名称 KameletBinding 仍然被支持,但它已被弃用。我们建议尽快将其重命名为 Pipe

我们建议更新 Kamelets,因为 Camel K 1.10.7 开始有很多更新。例如,您可以比较 1.102.3的 jms-amqp-10-sink.kamelet.yaml。

如果您有自定义 Kamelets,您必须相应地更新它们。

  • 重命名为 Kamelet 文件中的 模板
  • 属性 重命名为 bean 属性的属性。

1.4.1. Knative

当在 Camel K 中运行与 Knative 端点的集成路由时,Camel K Operator 会创建一些 Knative 对象,如 SinkBindingsTriggerSubscription。另外,Camel K Operator 会创建 knative.json 环境文件,需要 camel-knative 组件与集群中部署的 Knative 对象交互。

knative.json 示例

{
  "services": [
    {
      "type": "channel",
      "name": "messages",
      "url": "{{k.sink}}",
      "metadata": {
        "camel.endpoint.kind": "sink",
        "knative.apiVersion": "messaging.knative.dev/v1",
        "knative.kind": "Channel",
        "knative.reply": "false"
      }
    }
  ]
}

红帽构建的 Apache Camel for Quarkus 是一个 maven 项目。您必须手动创建这些 Knative 文件并提供额外的配置。如需了解将集成路由与 Knative 端点迁移,请参阅用例 2。

1.4.2. 监控

我们建议您添加自定义标签来标识集群中安装的 kubernetes 对象,以便更轻松地找到这些 kubernetes。默认情况下,quarkus openshift 扩展会添加标签 app.kubernetes.io/name=<app name >,以便您可以搜索使用此标签创建的对象。

为了监控目的,您可以使用 HawtIO diagnose 控制台 来监控 Camel 应用程序。

1.5. 迁移过程

迁移过程由以下步骤组成:

任务描述

创建 maven 项目

使用 Camel JBang 的 camel cli 导出文件,它将创建一个 maven 项目。

调整配置

通过添加和更改文件来配置项目。

Build

构建项目将生成 JAR 文件。构建容器镜像并推送到容器注册表。

部署

将 kubernetes 对象部署到 Openshift 集群并运行 pod。

1.5.1. 迁移步骤

1.5.1.1. 使用案例 1 - 使用配置简单集成路由

根据以下集成路由,带有 rest 和 kamelet 端点。

import org.apache.camel.builder.RouteBuilder;

public class Http2Jms extends RouteBuilder {
  @Override
  public void configure() throws Exception {
      rest()
      .post("/message")
      .id("rest")
      .to("direct:jms");

      from("direct:jms")
      .log("Sending message to JMS {{broker}}: ${body}")
      .to("kamelet:jms-amqp-10-sink?remoteURI=amqp://myhost:61616&destinationName=queue");
  }
}

http2jms.properties 文件

broker=amqp://172.30.177.216:61616
queue=qtest

kamel run 命令

kamel run Http2Jms.java -p file://$PWD/http2jms.properties --annotation some_annotation=foo --env MY_ENV1=VAL1

它使用注解构建并运行 pod。环境变量和属性文件作为 ConfigMap 添加并挂载到 pod 中。

1.5.1.1.1. 第 1 步 - 创建 maven 项目

使用 camel jbang 将文件导出到 maven 项目。

camel export \
--runtime=quarkus \
--quarkus-group-id=com.redhat.quarkus.platform \
--quarkus-version=3.8.5.redhat-00003 \
--repos=https://maven.repository.redhat.com/ga \
--dep=io.quarkus:quarkus-openshift \
--gav=com.mycompany:ceq-app:1.0 \
--dir=ceq-app1 \
Http2Jms.java

参数的描述:

参数描述

--runtime=quarkus

使用 Quarkus 运行时。生成的项目包含 quarkus BOM。

--quarkus-group-id=com.redhat.quarkus.platform

红帽支持的 quarkus 平台 maven 工件组是 com.redhat.quarkus.platform

--quarkus-version=3.8.5.redhat-00003

这是目前支持的最新版本。请参阅 Quarkus 文档中的 最新版本的。

--repos=https://maven.repository.redhat.com/ga

在 GA 版本中使用 Red Hat Maven 存储库。

--dep=io.quarkus:quarkus-openshift

将 quarkus-openshift 依赖项添加到 pom.xml 中,以在 Openshift 中进行构建。

--gav=com.mycompany:ceq-app:1.0

将 GAV 设置为生成的 pom.xml。您必须为项目相应地设置 GAV。

--dir=ceq-app1

maven 项目目录。

您可以使用 camel export --help查看更多参数

如果使用 kamelets,它必须是 maven 项目的一部分。您可以下载 Kamelet 存储库 并解压缩它。如果您有任何自定义 kamelet,请将它们添加到此 kamelet 目录中。

在使用 camel 导出时,您可以使用 parameter --local-kamelet-dir=<kamelet directory& gt;,它将所有 kamelets 复制到 src/main/resources/kamelets,稍后被打包到最终存档中。

如果您选择不使用 -local-kamelet-dir=<kamelet directory > 参数,则必须手动将所需的 kamelet yaml 文件复制到上述目录中。

跟踪生成的 pom 中的工件名称,因为工件名称在生成的 Openshift 文件中(Deployment、Service、Route 等)。

1.5.1.1.2. 第 2 步 - 配置项目

这是配置 maven 项目和工件以适合您的环境的步骤。

进入 maven 项目

cd ceq-app1

设置 docker 构建策略。

echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties

src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)

FROM registry.access.redhat.com/ubi9/openjdk-21:1.20

将 pom.xml 中的编译器版本更改为 21 (可选)

<maven.compiler.release>21</maven.compiler.release>

如果需要,在 src/main/resources/application.properties 中设置环境变量、标签和注解。

quarkus.openshift.annotations.sample_annotation=sample_value1
quarkus.openshift.env.vars.SAMPLE_KEY=sample_value2
quarkus.openshift.labels.sample_label=sample_value3

如果要使用这些参数自定义镜像和容器 registry 设置:

quarkus.container-image.registry
quarkus.container-image.group
quarkus.container-image.name
quarkus.container-image.tag

因为有一个 http2jms.properties,其配置在运行时使用,kamel cli 会创建一个 ConfigMap,并将它挂载到 pod 中。红帽构建的 Apache Camel for Quarkus 必须达到相同的目的。

'src/main/kubernetes/common.yml 中创建一个名为 ceq-app 的本地 ConfigMap 文件,该文件将是镜像构建过程的一部分。以下命令将 ConfigMap 键设置为 application.properties

oc create configmap ceq-app --from-file application.properties=http2jms.properties --dry-run=client -oyaml > src/main/kubernetes/common.yml

将以下属性添加到 application.properties,以便 Quarkus 挂载 ConfigMap

quarkus.openshift.app-config-map=ceq-app
1.5.1.1.3. 第 3 步 - 构建

构建用于本地检查的软件包。

./mvnw -ntp package

此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 文件。

跟踪 target/kubernetes/openshift.yml,以了解部署到 Openshift 集群的部署。

1.5.1.1.4. 第 4 步 - 构建和部署

构建软件包并部署到 Openshift

./mvnw -ntp package -Dquarkus.openshift.deploy=true

您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。

1.5.1.1.5. 第 5 步 - 测试

验证集成路由是否正常工作。

如果项目可以在本地运行,您可以尝试以下操作:

mvn -ntp quarkus:run

按照 pod 容器日志进行操作

oc logs -f `oc get pod -l app.kubernetes.io/name=app -oname`

它必须显示类似如下的输出:

INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar
INFO running in /deployments
__  ____  __  _____   ___  __ ____  ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
[org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime
[org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting
[org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary
[org.apa.cam.mai.BaseMainSupport] (main)     [MicroProfilePropertiesSource] broker=amqp://172.30.177.216:61616
[org.apa.cam.mai.BaseMainSupport] (main)     [MicroProfilePropertiesSource] queue=qtest
[org.apa.cam.mai.BaseMainSupport] (main)     [ms-amqp-10-sink.kamelet.yaml] destinationName=qtest
[org.apa.cam.mai.BaseMainSupport] (main)     [ms-amqp-10-sink.kamelet.yaml] connectionFactoryBean=connectionFactoryBean-1
[org.apa.cam.mai.BaseMainSupport] (main)     [ms-amqp-10-sink.kamelet.yaml] remoteURI=amqp://172.30.177.216:61616
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:3)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started route1 (direct://jms)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started rest (rest://post:/message)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started jms-amqp-10-sink-1 (kamelet://source)
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 17ms (build:0ms init:0ms start:17ms)
[io.quarkus] (main) app 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.115s. Listening on: http://0.0.0.0:8080
[io.quarkus] (main) Profile prod activated.
[io.quarkus] (main) Installed features: [camel-amqp, camel-attachments, camel-core, camel-direct, camel-jms, camel-kamelet, camel-microprofile-health, camel-platform-http, camel-rest, camel-rest-openapi, camel-yaml-dsl, cdi, kubernetes, qpid-jms, smallrye-context-propagation, smallrye-health, vertx]

请参阅 MicroProfilePropertiesSource 行,它显示添加为 ConfigMap 的属性文件的内容,并挂载到容器集。

1.5.1.2. 使用案例 2 - Knative 集成路由

这个用例有两个 Knative 集成路由。Feed 路由定期向 Knative 频道发送文本信息,第二个路由 Printer 接收来自 Knative 频道的信息并打印它。

对于 Camel K,有两个 pod,各自运行一个集成路由。因此,此迁移必须创建两个项目,各自具有一个集成路由。

之后,您可以将其自定义为单一 pod 中具有两个集成路由的单个 maven 项目。

Feed 集成路由。

import org.apache.camel.builder.RouteBuilder;

public class Feed extends RouteBuilder {
  @Override
  public void configure() throws Exception {
    from("timer:clock?period=15s")
      .setBody().simple("Hello World from Camel - ${date:now}")
      .log("sent message to messages channel: ${body}")
      .to("knative:channel/messages");
  }
}

打印机 集成路由。

import org.apache.camel.builder.RouteBuilder;

public class Printer extends RouteBuilder {
  @Override
  public void configure() throws Exception {
    from("knative:channel/messages")
      .convertBodyTo(String.class)
      .to("log:info");
  }
}

kamel run 命令显示如何使用 Camel K 运行。

kamel run Feed.java
kamel run Printer.java

将有两个 pod 正在运行。

1.5.1.2.1. 第 1 步 - 创建 maven 项目

使用 camel jbang 将文件导出到完整的 maven 项目

导出 集成。

camel export \
--runtime=quarkus \
--quarkus-group-id=com.redhat.quarkus.platform \
--quarkus-version=3.8.5.redhat-00003 \
--repos=https://maven.repository.redhat.com/ga \
--dep=io.quarkus:quarkus-openshift \
--gav=com.mycompany:ceq-feed:1.0 \
--dir=ceq-feed \
Feed.java

导出 打印机 集成。

camel export \
--runtime=quarkus \
--quarkus-group-id=com.redhat.quarkus.platform \
--quarkus-version=3.8.5.redhat-00003 \
--repos=https://maven.repository.redhat.com/ga \
--dep=io.quarkus:quarkus-openshift \
--gav=com.mycompany:ceq-printer:1.0 \
--dir=ceq-printer \
Printer.java

将为每个集成创建一个 maven 项目。

1.5.1.2.2. 第 2 步 - 配置项目

此步骤是配置 maven 项目和工件以适合您的环境。使用案例 1 包含有关 ConfigMap 中的标签、注解和配置的信息。

进入 maven 项目

cd ceq-feed

设置 docker 构建策略。

echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties

src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)

FROM registry.access.redhat.com/ubi9/openjdk-21:1.20

将 pom.xml 中的编译器版本更改为 21 (可选)

<maven.compiler.release>21</maven.compiler.release>

openshift 添加为部署目标。

quarkus.kubernetes.deployment-target=openshift

您必须设置这些容器镜像属性,以便在生成的 openshift.yml 和 knative.yml 文件中设置镜像地址。

quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000
quarkus.container-image.group=<namespace>

application.properties 中添加以下属性,以允许 Knative 控制器将 K_SINK 环境变量注入部署。

quarkus.openshift.labels."bindings.knative.dev/include"=true

src/main/resources 中添加 knative.json。这是 Camel 连接到 Knative 频道所需的配置。

注意

k.sink 属性占位符。当 pod 运行时,它将查看名为 K_SINK 的环境变量,并在 url 值中替换。

{
  "services": [
    {
      "type": "channel",
      "name": "messages",
      "url": "{{k.sink}}",
      "metadata": {
        "camel.endpoint.kind": "sink",
        "knative.apiVersion": "messaging.knative.dev/v1",
        "knative.kind": "Channel",
        "knative.reply": "false"
      }
    }
  ]
}

添加以下属性以允许 Camel 加载 Knative 环境配置。

camel.component.knative.environmentPath=classpath:knative.json

要使注入工作,您必须创建一个 Knative SinkBinding 对象。

SinkBinding 文件添加到 src/main/kubernetes/openshift.yml

cat <<EOF >> src/main/kubernetes/openshift.yml
apiVersion: sources.knative.dev/v1
kind: SinkBinding
metadata:
  finalizers:
  - sinkbindings.sources.knative.dev
  name: ceq-feed
spec:
  sink:
    ref:
      apiVersion: messaging.knative.dev/v1
      kind: Channel
      name: messages
  subject:
    apiVersion: apps/v1
    kind: Deployment
    name: ceq-feed
EOF

现在,配置 ceq-printer 项目。

cd ceq-printer

设置 docker 构建策略。

echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties

src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)

FROM registry.access.redhat.com/ubi9/openjdk-21:1.20

将 pom.xml 中的编译器版本更改为 21 (可选)

<maven.compiler.release>21</maven.compiler.release>

knative 设置为部署目标。

quarkus.kubernetes.deployment-target=knative

您必须设置这些容器镜像属性,以便在生成的 openshift.yml 和 knative.yml 文件中正确设置镜像地址。

quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000
quarkus.container-image.group=<namespace>

src/main/resources 中添加 knative.json。这是 Camel 连接到 Knative 频道所需的配置。

{
  "services": [
    {
      "type": "channel",
      "name": "messages",
      "path": "/channels/messages",
      "metadata": {
        "camel.endpoint.kind": "source",
        "knative.apiVersion": "messaging.knative.dev/v1",
        "knative.kind": "Channel",
        "knative.reply": "false"
      }
    }
  ]
}

添加以下属性以允许 Camel 加载 Knative 环境配置。

camel.component.knative.environmentPath=classpath:knative.json

从频道到 sink 的消息发送需要 Knative 订阅

Subscription 文件添加到 src/main/kubernetes/knative.yml

apiVersion: messaging.knative.dev/v1
kind: Subscription
metadata:
  finalizers:
  - subscriptions.messaging.knative.dev
  name: ceq-printer
spec:
  channel:
    apiVersion: messaging.knative.dev/v1
    kind: Channel
    name: messages
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: ceq-printer
    uri: /channels/messages
1.5.1.2.3. 第 3 步 - 构建

构建用于本地检查的软件包。

./mvnw -ntp package

此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 文件。

跟踪 target/kubernetes/openshift.yml 和 'target/kubernetes/knative.yml',以了解部署到 Openshift 集群的部署。

1.5.1.2.4. 第 4 步 - 构建和部署

构建软件包并部署到 Openshift。

./mvnw -ntp package -Dquarkus.openshift.deploy=true

您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。

1.5.1.2.5. 第 5 步 - 测试

验证集成路由是否正常工作。

按照 pod 容器日志进行操作

oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-feed -oname`

它必须显示类似如下的输出:

CEQ-feed pod

INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar
INFO running in /deployments
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
[org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime
[org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting
[org.apa.cam.mai.BaseMainSupport] (main) Auto-configuration summary
[org.apa.cam.mai.BaseMainSupport] (main)     [MicroProfilePropertiesSource] camel.component.knative.environmentPath=classpath:knative.json
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting
[org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary
[org.apa.cam.mai.BaseMainSupport] (main)     [OS Environment Variable]      k.sink=http://hello-kn-channel.cmiranda-camel.svc.cluster.local
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:1)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started route1 (timer://clock)
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 43ms (build:0ms init:0ms start:43ms)
[io.quarkus] (main) ceq-feed 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.386s. Listening on: http://0.0.0.0:8080
[io.quarkus] (main) Profile prod activated.
[io.quarkus] (main) Installed features: [camel-attachments, camel-cloudevents, camel-core, camel-knative, camel-platform-http, camel-rest, camel-rest-openapi, camel-timer, cdi, kubernetes, smallrye-context-propagation, vertx]
[route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:54:41 UTC 2024
[route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:54:56 UTC 2024
[route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:55:11 UTC 2024

请参阅 Property-placeholders。它显示 k.sink 属性值。

CEQ-printer pod

INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar
INFO running in /deployments
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
[org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime
[org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting
[org.apa.cam.mai.BaseMainSupport] (main) Auto-configuration summary
[org.apa.cam.mai.BaseMainSupport] (main)     [MicroProfilePropertiesSource] camel.component.knative.environmentPath=classpath:knative.json
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:1)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started route1 (knative://channel/hello)
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 10ms (build:0ms init:0ms start:10ms)
[io.quarkus] (main) ceq-printer 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.211s. Listening on: http://0.0.0.0:8080
[io.quarkus] (main) Profile prod activated.
[io.quarkus] (main) Installed features: [camel-attachments, camel-cloudevents, camel-core, camel-knative, camel-log, camel-platform-http, camel-rest, camel-rest-openapi, cdi, kubernetes, smallrye-context-propagation, vertx]
[info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:54:41 UTC 2024]
[info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:54:56 UTC 2024]
[info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:55:11 UTC 2024]
1.5.1.3. 使用案例 3 - Pipe

将以下集成路由指定为 KameletBinding。

apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: sample
spec:
  source:
    ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1alpha1
      name: timer-source
    properties:
      period: 5000
      contentType: application/json
      message:  '{"id":"1","field":"hello","message":"Camel Rocks"}'
  steps:
  - ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1alpha1
      name: extract-field-action
    properties:
      field: "message"
  sink:
    ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1
      name: log-sink
    properties:
      showStreams: true
1.5.1.3.1. 第 1 步 - 创建 maven 项目

使用 camel jbang 将文件导出到 maven 项目。

camel export \
--runtime=quarkus \
--quarkus-group-id=com.redhat.quarkus.platform \
--quarkus-version=3.8.5.redhat-00003 \
--repos=https://maven.repository.redhat.com/ga \
--dep=io.quarkus:quarkus-openshift \
--gav=com.mycompany:ceq-timer2log-kbind:1.0 \
--dir=ceq-timer2log-kbind \
timer-2-log-kbind.yaml

您可以使用 camel export --help查看更多参数

1.5.1.3.2. 第 2 步 - 配置项目

这是配置 maven 项目和工件以适合您的环境的步骤。

注意

您可以遵循常见配置的用例 1 和 2,我们将提供 KameletBinding 配置所需的步骤。

您可以尝试使用 camel jbang 在本地运行集成路由,以了解它在构建和部署到 Openshift 前如何工作。

进入 maven 项目

cd ceq-timer2log-kbind

请参阅关于如何管理 Kamelets 的开头的备注。对于此迁移用例,我在 pom.xml 中使用 org.apache.camel.kamelets:camel-kamelets 依赖项。

在导出时,它会在 application.properties 中添加以下属性,但您可以将其删除。

quarkus.native.resources.includes
camel.main.routes-include-pattern

设置 docker 构建策略。

echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties

如果您的 KameletKameletBinding 具有如下特征注解: trait.camel.apache.org/environment.vars: "my_key=my_val",那么您必须遵循特征配置部分来使用 Quarkus 属性进行设置。

1.5.1.3.3. 第 3 步 - 构建

构建用于本地检查的软件包。

./mvnw -ntp package

此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 清单文件。

跟踪 target/kubernetes/openshift.yml,以了解部署到 Openshift 集群的部署。

1.5.1.3.4. 第 4 步 - 构建和部署

构建软件包并部署到 Openshift。

./mvnw -ntp package -Dquarkus.openshift.deploy=true

您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。

1.5.1.3.5. 第 5 步 - 测试

验证集成路由是否正常工作。

按照 pod 容器日志进行操作

oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-timer2log-kbind -oname`

它必须显示类似如下的输出:

[org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime
[org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting
[org.apa.cam.cli.con.LocalCliConnector] (main) Management from Camel JBang enabled
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting
[org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary
[org.apa.cam.mai.BaseMainSupport] (main)     [timer-source.kamelet.yaml]    period=5000
[org.apa.cam.mai.BaseMainSupport] (main)     [timer-source.kamelet.yaml]    message={"id":"1","field":"hello","message":"Camel Rocks"}
[org.apa.cam.mai.BaseMainSupport] (main)     [timer-source.kamelet.yaml]    contentType=application/json
[org.apa.cam.mai.BaseMainSupport] (main)     [log-sink.kamelet.yaml]        showStreams=true
[org.apa.cam.mai.BaseMainSupport] (main)     [ct-field-action.kamelet.yaml] extractField=extractField-1
[org.apa.cam.mai.BaseMainSupport] (main)     [ct-field-action.kamelet.yaml] field=message
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:4)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started sample (kamelet://timer-source)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started timer-source-1 (timer://tick)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started log-sink-2 (kamelet://source)
[org.apa.cam.imp.eng.AbstractCamelContext] (main)     Started extract-field-action-3 (kamelet://source)
[org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 276ms (build:0ms init:0ms start:276ms)
[io.quarkus] (main) ceq-timer2log-kbind 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.867s. Listening on: http://0.0.0.0:8080
[io.quarkus] (main) Profile prod activated.
[io.quarkus] (main) Installed features: [camel-attachments, camel-cli-connector, camel-console, camel-core, camel-direct, camel-jackson, camel-kamelet, camel-log, camel-management, camel-microprofile-health, camel-platform-http, camel-rest, camel-rest-openapi, camel-timer, camel-xml-jaxb, camel-yaml-dsl, cdi, kubernetes, smallrye-context-propagation, smallrye-health, vertx]
[log-sink] (Camel (camel-1) thread #2 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: org.apache.camel.converter.stream.InputStreamCache, Body: "Camel Rocks"]

1.5.2. 取消部署 kubernetes 资源

要删除 quarkus-maven-plugin 安装的所有 resouces,您必须运行以下命令:

oc delete -f target/kubernetes/openshift.yml

1.5.3. Kubernetes CronJob

当有类型为 cron、quartz 或 timer 的消费者时,Camel K 具有一个功能。在某些情况下,它会创建一个 kubernetes CronJob 对象而不是常规 部署。这会通过不运行 Deployment Pod 来节省计算资源。

要获取红帽构建的 Apache Camel for Quarkus 的结果,您必须在 src/main/resources/application.properties 中设置以下属性。

quarkus.openshift.deployment-kind=CronJob
quarkus.openshift.cron-job.schedule=<your cron schedule>
camel.main.duration-max-idle-seconds=1

您必须将计时器消费者设置为仅执行一次,如下所示:

from("timer:java?delay=0&period=1&repeatCount=1")

以下是计时器参数:

  • delay=0 :启动没有延迟的消费者。
  • period=1 :仅运行一次 1s。
  • repeatCount=1: Don't 在第一次运行后运行。

1.6. 故障排除

1.6.1. 产品支持

如果您在迁移过程中遇到任何问题,您可以创建一个支持问题单,我们将帮助您解决问题。

1.6.2. 忽略使用 camel jbang 导出时的加载错误

使用 camel jbang 导出时,可能无法加载路由。在这里,您可以使用 --ignore-loading-error 参数,如下所示:

camel export --ignore-loading-error <parameters>

1.6.3. 增加日志记录

您可以通过在 org.apache.camel.component.knative 类别的 application.properties 中的以下属性设置为 debug 级别来设置类别日志记录。

quarkus.log.category."org.apache.camel.component.knative".level=debug

1.6.4. 禁用健康检查

您的应用 Pod 可能会失败,CrashLoopBackOff,日志 Pod 会出现以下错误:

Get "http://127.0.0.1:8080/q/health/ready": dial tcp 127.0.0.1:8080: connect: connection refused

如果您不希望容器健康检查,您可以通过从 pom.xml 中删除这个 maven 依赖项来禁用容器健康检查

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-microprofile-health</artifactId>
</dependency>

1.7. 已知问题

有几个与迁移集成路由相关的已知问题及其临时解决方案。这些临时解决方案不是红帽构建的 Apache Camel for Quarkus 的限制,而是迁移过程的一部分。迁移完成后,生成的 Maven 项目可以自定义以满足客户的需求。

1.7.1. Camel K 功能在 Camel for Quarkus 中不可用

一些 Camel K 功能在 Quarkus 或 Camel 中不能作为 quarkus 属性提供。这些功能可能需要额外的配置步骤,以便在红帽构建的 Apache Camel for Quarkus 中构建和部署时获得相同的功能。

1.7.1.1. 所有者 Trait

owner trait 为所有创建的资源设置 kubernetes owner 字段,简化了跟踪谁创建了 kubernetes 资源的过程。

一个 open Quarkus 问题 #13952 请求此功能。

没有临时解决方案来设置所有者字段。

1.7.1.2. 关联性 Trait

节点关联性特征 允许您限制调度集成 pod 运行的节点。

存在一个开放的 Quarkus 问题,请求 此功能。

解决办法是在 maven 软件包步骤后实施后处理任务,将关联性配置添加到 target/kubernetes/openshift.yml 中。

1.7.1.3. PodDisruptionBudget Trait

PodDisruptionBudget trait 允许为集成 pod 配置 PodDisruptionBudget 资源。

Quarkus 中有配置来生成 PodDisruptionBudget 资源。

解决办法是在 maven 软件包步骤后实施后处理任务,将 PodDisruptionBudget 配置添加到 target/kubernetes/openshift.yml 中。

1.7.2. Camel Jbang 无法添加 camel-quarkus-direct 依赖项

如果集成路由包含 rest 和一个 直接 端点,如下例所示,请验证 pom.xml 是否包含 camel-quarkus-direct 依赖项。如果缺少,您必须添加它。

rest()
    .post("/message")
    .id("rest")
    .to("direct:foo");

from("direct:foo")
    .log("hello");

camel-quarkus-direct 依赖项,以添加到 pom.xml

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-direct</artifactId>
</dependency>

1.7.3. Quarkus 构建失败并显示

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

客户端不信任服务器证书。因此,您必须将服务器公钥添加到客户端,或信任服务器证书。如果要测试,您可以在 src/main/resources/application.properties 中添加以下属性并重建它。

quarkus.kubernetes-client.trust-certs=true

1.7.4. Camel Jbang 无法导出路由

当路由包含 kamelet 端点时,Camel Jbang 无法导出路由,该端点由 bean 支持。如果端点包含 kamelet,带有属性占位符 {{broker}},且在 kamelet 中有一个 type: " installationclass:org.apache.qpid.jms.jms.JmsConnectionFactory" 来初始化 camel 组件,它可能会失败。

from("direct:jms")
.to("kamelet:jms-amqp-10-sink?remoteURI={{broker}}&destinationName={{queue}}");

此错误由以下错误组成:

org.apache.camel.RuntimeCamelException: org.apache.camel.VetoCamelContextStartException: Failure creating route from template: jms-amqp-10-sink
Caused by: org.apache.camel.VetoCamelContextStartException: Failure creating route from template: jms-amqp-10-sink
Caused by: org.apache.camel.component.kamelet.FailedToCreateKameletException: Error creating or loading Kamelet with id jms-amqp-10-sink (locations: classpath:kamelets,github:apache:camel-kamelets/kamelets)
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route jms-amqp-10-sink-1 at: >>> To[jms:{{destinationType}}:{{destinationName}}?connectionFactory=#bean:{{connectionFactoryBean}}]
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: jms://Queue:$%7Bqueue%7D?connectionFactory=%23bean%3AconnectionFactoryBean-1 due to: Error binding property (connectionFactory=#bean:connectionFactoryBean-1)
Caused by: org.apache.camel.PropertyBindingException: Error binding property (connectionFactory=#bean:connectionFactoryBean-1) with name: connectionFactory on bean:
Caused by: java.lang.IllegalStateException: Cannot create bean: #class:org.apache.qpid.jms.JmsConnectionFactory
Caused by: org.apache.camel.PropertyBindingException: Error binding property (remoteURI=@@[broker]@@) with name: remoteURI on bean: org.apache.qpid.jms.JmsConnectionFactory@a2b54e3 with value: @@[broker]@@
Caused by: java.lang.IllegalArgumentException: Invalid remote URI: @@[broker]@@
Caused by: java.net.URISyntaxException: Illegal character in path at index 2: @@[broker]@@

如何修复:

将 kamelet 端点 {{broker}}{{queue}} 中的属性占位符替换为任何值,例如: remoteURI=broker&destinationName=queue。现在,导出该文件,您可以在 src/main/ 目录中的导出路由中添加属性占位符。

1.8. 参考文档

有关 Camel 产品的详情,请参考以下链接:

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.