4.3. 创建并运行 Camel 路由


您可以使用 init 命令创建新的基本路由。例如,要创建一个 XML 路由,请运行以下命令:

camel init cheese.xml
Copy to Clipboard Toggle word wrap

这会创建带有示例路由的文件 cheese.xml (当前目录中)。

要运行该文件,请运行:

camel run cheese.xml
Copy to Clipboard Toggle word wrap
注意

您可以在 Camel 中创建并运行任何受支持的 DSL,如 YAML、XML、Java、Groovy。

要创建新的 .java 路由,请运行:

camel init foo.java
Copy to Clipboard Toggle word wrap

当您使用 init 命令时,Camel 默认在当前目录中创建该文件。但是,您可以使用 --directory 选项在指定的目录中创建文件。例如,要在名为 foobar 的文件夹中创建,请运行:

camel init foo.java --directory=foobar
Copy to Clipboard Toggle word wrap
注意

当您使用 --directory 选项时,Camel 会自动清理此目录(如果已存在)。

4.3.1. 从多个文件运行路由

您可以从多个文件运行路由,例如运行两个 YAML 文件:

camel run one.yaml two.yaml
Copy to Clipboard Toggle word wrap

您可以从两个不同的文件(如 yaml 和 Java)运行路由:

camel run one.yaml hello.java
Copy to Clipboard Toggle word wrap

您可以使用通配符(例如,X)匹配多个文件,例如运行所有 yaml 文件:

camel run *.yaml
Copy to Clipboard Toggle word wrap

您可以运行以 foo* 开头的所有文件:

camel run foo*
Copy to Clipboard Toggle word wrap

要运行 目录中的所有文件,请使用:

camel run *
Copy to Clipboard Toggle word wrap
注意

run 目标也可以检测是 属性 的文件,如 application.properties

4.3.2. 从输入参数运行路由

对于非常小的 Java 路由,可以将路由作为 CLI 参数提供,如下所示:

camel run --code='from("kamelet:beer-source").to("log:beer")'
Copy to Clipboard Toggle word wrap

这非常有限,因为 CLI 参数比文件使用点太繁琐。当您运行来自输入参数的路由时,请记住:

  • 仅支持 Java DSL 代码。
  • 代码以单引号括起,因此您可以在 Java DSL 中使用双引号。
  • 代码仅限于可以从终端和 JBang 提供哪些字面值。
  • 所有路由都必须在单个 --code 参数中定义。
注意

使用 --code 仅适用于非常快速和小型原型。

4.3.3. 带有实时重新加载的 dev 模式

当源文件被更新(保存),您可以使用 --dev 选项启用包含路由的实时重新加载的 dev 模式,如下所示:

camel run foo.yaml --dev
Copy to Clipboard Toggle word wrap

然后,在 Camel 集成运行时,您可以更新 YAML 路由并在保存时更新。这个选项可用于包括 java 的所有 DLS,例如:

camel run hello.java --dev
Copy to Clipboard Toggle word wrap
注意

live reload 选项仅用于开发目的,如果您遇到重新加载 JVM 类问题的问题,则可能需要重新启动集成。

4.3.4. 开发人员控制台

您可以启用开发人员控制台,为开发人员提供各种信息。要启用开发人员控制台,请运行:

camel run hello.java --console
Copy to Clipboard Toggle word wrap

然后可以从 Web 浏览器通过 http://localhost:8080/q/dev (默认)访问控制台。当 Camel 启动时,该链接也会在日志中显示。

控制台可让您了解正在运行的 Camel 集成,例如报告处理消息的最多路由。然后,您可以在这些路由中识别最慢的 EIP。

开发人员控制台也可以以 JSON 格式输出数据,供第三方工具用于捕获信息。例如,要通过 curl 输出顶级路由,请运行:

curl -s -H "Accept: application/json"  http://0.0.0.0:8080/q/dev/top/
Copy to Clipboard Toggle word wrap

如果您安装了 jq,则可以以 colour 格式并输出 JSON 数据,请运行:

curl -s -H "Accept: application/json"  http://0.0.0.0:8080/q/dev/top/ | jq
Copy to Clipboard Toggle word wrap

4.3.5. 使用配置集

Camel CLI 中的 配置集 是一个名称(id),它引用使用 Camel CLI 自动载入的配置。默认配置集被命名为为应用程序,它是一个(smart default),以便 Camel CLI 自动加载 application.properties (如果存在)。这意味着您可以创建与具有相同名称的特定属性文件匹配的配置集。

例如,使用名为 local 的配置集运行 意味着 Camel CLI 将加载 local.properties 而不是 application.properties。要使用配置集,请指定命令行选项 --profile,如下所示:

camel run hello.java --profile=local
Copy to Clipboard Toggle word wrap

一次只能指定一个配置集名称,如 --profile=local,two 无效。

属性文件中,您可以配置 Camel Main 中的所有配置。要关闭并启用日志屏蔽,请运行以下命令:

camel.main.streamCaching=false
camel.main.logMask=true
Copy to Clipboard Toggle word wrap

您还可以配置 Camel 组件,如 camel-kafka 来声明代理的 URL:

camel.component.kafka.brokers=broker1:9092,broker2:9092,broker3:9092
Copy to Clipboard Toggle word wrap
注意

camel.jbang 开头的键是 Camel CLI 内部使用的保留密钥,并允许为 Camel CLI 命令预配置参数。

4.3.6. 通过互联网下载 JAR

默认情况下,Camel CLI 会自动解析运行 Camel 所需的依赖项,这由 JBang 和 Camel 分别完成。如果组件对当前在类路径上不可用的 JAR 的需求,则 Camel 本身会在运行时检测,然后可以自动下载 JAR。

Camel 按照以下顺序下载这些 JAR:

  1. 来自 ~/.m2/repository中的本地磁盘
  2. 来自 Maven Central 的互联网
  3. 从互联网的自定义第三方 Maven 存储库
  4. ~/.m2/settings.xml 的活动配置文件中找到的所有软件仓库,或使用 --maven-settings 选项指定的设置文件。

如果您不希望 Camel CLI 通过互联网下载,您可以使用 --download 选项关闭它,如下所示:

camel run foo.java --download=false
Copy to Clipboard Toggle word wrap

4.3.7. 添加自定义 JAR

Camel CLI 会自动检测 Camel 组件、语言和数据格式的依赖项。这意味着不需要指定要使用的 JAR。但是,如果您需要添加第三方自定义 JAR,您可以在 Maven GAV 语法中使用 --deps 指定为 CLI 参数(groupId:artifactId:version),例如:

camel run foo.java --deps=com.foo:acme:1.0
Copy to Clipboard Toggle word wrap
To add a Camel dependency explicitly you can use a shorthand syntax (starting with `camel:` or `camel-`):
Copy to Clipboard Toggle word wrap
camel run foo.java --deps=camel-saxon
Copy to Clipboard Toggle word wrap

您可以指定用逗号分开的多个依赖项:

camel run foo.java --deps=camel-saxon,com.foo:acme:1.0
Copy to Clipboard Toggle word wrap

4.3.8. 使用第三方 Maven 存储库

Camel CLI 首先从本地存储库下载,然后从在线 Maven Central 存储库下载。要从第三方 Maven 存储库下载,您必须将此项指定为 CLI 参数,或者在 application.properties 文件中指定。

camel run foo.java --repos=https://packages.atlassian.com/maven-external
Copy to Clipboard Toggle word wrap
注意

您可以指定用逗号分开的多个软件仓库。

第三方 Maven 存储库的配置在 application.properties 文件中配置,其键为 camel.jbang.repos,如下所示:

camel.jbang.repos=https://packages.atlassian.com/maven-external
Copy to Clipboard Toggle word wrap

运行 Camel 路由时,会自动载入 application.properties

camel run foo.java
Copy to Clipboard Toggle word wrap

您还可以明确指定要使用的属性文件:

camel run foo.java application.properties
Copy to Clipboard Toggle word wrap

或者您可以将其指定为配置集:

camel run foo.java --profile=application
Copy to Clipboard Toggle word wrap

其中 profile id 是属性文件的名称。

4.3.9. 配置 Maven 使用情况

默认情况下,会加载现有的 ~/.m2/settings.xml 文件,因此可以更改 Maven 解析过程的行为。Maven 设置文件提供有关 Maven 镜像、凭证配置(可能加密的)或活动配置集和其他存储库的信息。

Maven 存储库可以使用身份验证,Maven-way 来配置凭证是通过 < server> 元素:

<server>
    <id>external-repository</id>
    <username>camel</username>
    <password>{SSVqy/PexxQHvubrWhdguYuG7HnTvHlaNr6g3dJn7nk=}</password>
</server>
Copy to Clipboard Toggle word wrap

虽然可以使用纯文本指定密码,但我们建议您首先配置 maven master 密码,然后使用它配置存储库密码:

$ mvn -emp
Master password: camel
{hqXUuec2RowH8dA8vdqkF6jn4NU9ybOsDjuTmWvYj4U=}
Copy to Clipboard Toggle word wrap

以上密码必须添加到 ~/.m2/settings-security.xml 文件中,如下所示:

<settingsSecurity>
  <master>{hqXUuec2RowH8dA8vdqkF6jn4NU9ybOsDjuTmWvYj4U=}</master>
</settingsSecurity>
Copy to Clipboard Toggle word wrap

然后,您可以配置常规密码:

$ mvn -ep
Password: camel
{SSVqy/PexxQHvubrWhdguYuG7HnTvHlaNr6g3dJn7nk=}
Copy to Clipboard Toggle word wrap

然后您可以在 < server>/<password&gt; 配置中使用此密码。

默认情况下,Maven 从 ~/.m2/settings-security.xml 文件中读取 master 密码,但您可以覆盖它。可以按照如下所示指定 settings.xml 文件本身的位置:

camel run foo.java --maven-settings=/path/to/settings.xml --maven-settings-security=/path/to/settings-security.xml
Copy to Clipboard Toggle word wrap

如果要在不假定任何位置的情况下运行 Camel 应用程序(甚至 ~/.m2/settings.xml),请使用这个选项:

camel run foo.java --maven-settings=false
Copy to Clipboard Toggle word wrap

4.3.10. 运行托管在 GitHub 上的路由

您可以使用 Camels 资源加载程序运行托管在 GitHub 上的路由。例如,要运行其中一个 Camel K 示例,请使用:

camel run github:apache:camel-kamelets-examples:jbang/hello-java/Hey.java
Copy to Clipboard Toggle word wrap

您还可以将 https URL 用于 GitHub。例如,您可以从 web-browser 中浏览示例,然后从浏览器窗口中复制 URL,并使用 Camel CLI 运行示例:

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/hello-java
Copy to Clipboard Toggle word wrap

您还可以使用通配符(例如 \ *)匹配多个文件,如运行所有 groovy 文件:

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/languages/*.groovy
Copy to Clipboard Toggle word wrap

或者,您可以运行以 rou* 开头的所有文件:

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/languages/rou*
Copy to Clipboard Toggle word wrap

4.3.10.1. 从 GitHub gists 运行路由

使用 GitHub 中的 gists 是一种快速共享您可轻松运行的小型 Camel 路由的方法。例如,要运行 gist,请使用:

camel run https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92
Copy to Clipboard Toggle word wrap

Gist 可以包含一个或多个文件,Camel CLI 将收集所有相关文件,因此 gist 可以包含多个路由、属性文件和 Java Bean。

4.3.11. 下载托管在 GitHub 上的路由

您可以使用 Camel CLI 将现有的示例从 GitHub 下载到本地磁盘,这允许修改示例并在本地运行。例如,您可以通过运行以下命令来下载 依赖项注入 示例:

camel init https://github.com/apache/camel-kamelets-examples/tree/main/jbang/dependency-injection
Copy to Clipboard Toggle word wrap

然后,文件(不是子文件夹)下载到当前目录中。然后您可以使用以下内容在本地运行示例:

camel run *
Copy to Clipboard Toggle word wrap

您还可以使用 --directory 选项将文件下载到新文件夹中,例如要将文件下载到名为 myproject 的文件夹,请运行:

camel init https://github.com/apache/camel-kamelets-examples/tree/main/jbang/dependency-injection --directory=myproject
Copy to Clipboard Toggle word wrap
注意

使用 --directory 选项时,如果已存在,Camel 将自动清理此目录。

您可以在 dev 模式下运行示例,以热部署源代码更改。

camel run * --dev
Copy to Clipboard Toggle word wrap

您可以下载单个文件,例如要下载其中一个 Camel K 示例,请运行:

camel init https://github.com/apache/camel-k-examples/blob/main/generic-examples/languages/simple.groovy
Copy to Clipboard Toggle word wrap

这是一个 groovy 路由,您可以使用 (或使用 *)运行:

camel run simple.groovy
Copy to Clipboard Toggle word wrap

4.3.11.1. 下载路由表单 GitHub gists

您可以从 gists 下载文件,如下所示:

camel init https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92
Copy to Clipboard Toggle word wrap

这会将文件下载到本地磁盘,稍后您可以运行:

camel run *
Copy to Clipboard Toggle word wrap

您可以使用 --directory 选项下载至新文件夹,例如,要下载到名为 foobar 的文件夹,请运行:

camel init https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92 --directory=foobar
Copy to Clipboard Toggle word wrap
注意

使用 --directory 选项时,如果已存在,Camel 会自动清理此目录。

4.3.12. 使用特定的 Camel 版本

您可以指定要运行哪个 Camel 版本,如下所示:

jbang run -Dcamel.jbang.version=4.0.0 camel@apache/camel [command]
Copy to Clipboard Toggle word wrap
注意

较旧版本的 Camel 可能无法使用 Camel CLI 作为最新版本。建议您使用从 Camel 3.18 开始的版本。

您还可以使用 SNAPSHOT 尝试加快边缘开发,例如:

jbang run --fresh -Dcamel.jbang.version=4.0.0-SNAPSHOT camel@apache/camel [command]
Copy to Clipboard Toggle word wrap

4.3.13. 运行 Camel K 集成或绑定

Camel 支持以 CRD 格式(Kubernetes 自定义资源定义)。对于运行名为 joke.yaml 的 kamelet 绑定文件,运行名为 joke.yaml 的 Camel K 集成和绑定文件:

#!/usr/bin/env jbang camel@apache/camel run
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: joke
spec:
  source:
    ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1
      name: chuck-norris-source
    properties:
      period: 2000
  sink:
    ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1
      name: log-sink
    properties:
      show-headers: false
Copy to Clipboard Toggle word wrap
camel run joke.yaml
Copy to Clipboard Toggle word wrap

4.3.14. 从剪贴板中运行

您可以直接从 OS 剪贴板运行 Camel 路由。这允许复制一些代码,然后快速运行路由。

camel run clipboard.<extension>
Copy to Clipboard Toggle word wrap

其中 <extension>,是剪贴板内容的类型,如 javaxmlyaml

例如,您可以将它复制到剪贴板,然后运行路由:

<route>
  <from uri="timer:foo"/>
  <log message="Hello World"/>
</route>
Copy to Clipboard Toggle word wrap
camel run clipboard.xml
Copy to Clipboard Toggle word wrap

4.3.15. 控制本地 Camel 集成

要列出当前运行的 Camel 集成,请使用 ps 选项:

camel ps
  PID   NAME                          READY  STATUS    AGE
 61818  sample.camel.MyCamelApplica…   1/1   Running  26m38s
 62506  test1                          1/1   Running   4m34s
Copy to Clipboard Toggle word wrap

这将列出集成的 PID、名称和年龄。

您可以使用 stop 命令停止任何正在运行的 Camel 集成。例如,要停止 test1,请运行:

camel stop test1
Stopping running Camel integration (pid: 62506)
Copy to Clipboard Toggle word wrap

您可以使用 PID 来停止集成:

camel stop 62506
Stopping running Camel integration (pid: 62506)
Copy to Clipboard Toggle word wrap
注意

您不必输入全名,因为 stop 命令将与以输入开头的集成匹配,例如,您可以键入 camel stop t 来停止所有以 t 开头的集成。

要停止所有集成,请使用 --all 选项,如下所示:

camel stop --all
Stopping running Camel integration (pid: 61818)
Stopping running Camel integration (pid: 62506)
Copy to Clipboard Toggle word wrap

4.3.16. 控制 Spring Boot 和 Quarkus 集成

默认情况下,Camel CLI 仅控制使用 CLI 运行的 Camel 集成,例如 camel run foo.java

要使 CLI 能够控制和管理 Spring Boot 或 Quarkus 应用程序,您需要向这些项目添加依赖项,以便与 Camel CLI 集成。

Spring Boot

在 Spring Boot 应用程序中,添加以下依赖项:

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-cli-connector-starter</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

Quarkus

在 Quarkus 应用程序中,添加以下依赖项:

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-cli-connector</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

4.3.17. 获取 Camel 集成状态

Camel CLI 中的 get 命令用于为一个或多个正在运行的 Camel 集成获取 Camel 特定状态。要显示正在运行的 Camel 集成的状态,请运行:

camel get
  PID   NAME      CAMEL            PLATFORM            READY  STATUS    AGE    TOTAL  FAILED  INFLIGHT  SINCE-LAST
 61818  MyCamel   3.20.1-SNAPSHOT  Spring Boot v2.7.3   1/1   Running  28m34s    854       0         0     0s/0s/-
 63051  test1     3.20.1-SNAPSHOT  JBang                1/1   Running     18s     14       0         0     0s/0s/-
 63068  mygroovy  3.20.1-SNAPSHOT  JBang                1/1   Running      5s      2       0         0     0s/0s/-
Copy to Clipboard Toggle word wrap

camel get 命令显示默认集成,它等同于输入 camel get integrationscamel get int 命令。

这会显示每个 Camel 集成的整体信息,您可以在其中查看处理的消息总数。列 Since Last 显示最后一次处理三个阶段的消息前的时长(started/completed/failed)。

0s/0s/- 值表示刚刚发生最后一个启动和完成的消息(0 秒前),并且还没有任何失败的消息。在这个示例中,9s/9s/1h3m 表示最后启动和完成的消息是 9 秒前,最后失败为 1 小时,3 分钟以前。

您还可以查看每个路由的状态,来自所有本地 Camel 与 camel get 路由 集成:

camel get route
  PID   NAME      ID      FROM                        STATUS    AGE   TOTAL  FAILED  INFLIGHT  MEAN  MIN  MAX  SINCE-LAST
 61818  MyCamel   hello   timer://hello?period=2000   Running  29m2s    870       0         0     0    0   14     0s/0s/-
 63051  test1      java    timer://java?period=1000    Running    46s     46       0         0     0    0    9     0s/0s/-
 63068  mygroovy  groovy  timer://groovy?period=1000  Running    34s     34       0         0     0    0    5     0s/0s/-
Copy to Clipboard Toggle word wrap
注意

使用 camel get --help 显示所有可用的命令。

4.3.17.1. Camel 集成的主要状态

camel top 命令用于获取正在运行的 Camel 集成的最高利用率统计(最高为最低堆使用的内存)。

camel top
  PID   NAME     JAVA     CAMEL            PLATFORM            STATUS    AGE         HEAP        NON-HEAP     GC     THREADS   CLASSES
 22104  chuck    11.0.13  3.20.1-SNAPSHOT  JBang               Running   2m10s  131/322/4294 MB  70/73 MB  17ms (6)      7/8  7456/7456
 14242  MyCamel  11.0.13  3.20.1-SNAPSHOT  Spring Boot v2.7.3  Running  33m40s  115/332/4294 MB  62/66 MB  37ms (6)    16/16  8428/8428
 22116  bar      11.0.13  3.20.1-SNAPSHOT  JBang               Running    2m7s   33/268/4294 MB  54/58 MB  20ms (4)      7/8  6104/6104
Copy to Clipboard Toggle word wrap

HEAP 列显示堆内存(used/committed/max)和 non-heap (used/committed)。GC 列显示垃圾回收信息(时间和总计运行)。CLASSES 列显示类数(loaded/total)。

您还可以从与 camel 顶部 路由的所有本地 Camel 集成中看到每个路由的最高执行路由(最高为最低的意味着处理时间):

camel top route
  PID   NAME     ID                     FROM                                 STATUS    AGE    TOTAL  FAILED  INFLIGHT  MEAN  MIN  MAX  SINCE-LAST
 22104  chuck    chuck-norris-source-1  timer://chuck?period=10000           Started     10s      1       0         0   163  163  163          9s
 22116  bar      route1                 timer://yaml2?period=1000            Started      7s      7       0         0     1    0   11          0s
 22104  chuck    chuck                  kamelet://chuck-norris-source        Started     10s      1       0         0     0    0    0          9s
 22104  chuck    log-sink-2             kamelet://source?routeId=log-sink-2  Started     10s      1       0         0     0    0    0          9s
 14242  MyCamel  hello                  timer://hello?period=2000            Started  31m41s    948       0         0     0    0    4          0s
Copy to Clipboard Toggle word wrap
注意

使用 camel top --help 显示所有可用的命令。

4.3.17.2. 启动和停止路由

camel cmd 用于在运行的 Camel 集成中执行各种命令,例如,用于启动和停止路由的命令。

要停止 chuck 集成中的所有路由,请运行:

camel cmd stop-route chuck
Copy to Clipboard Toggle word wrap

然后,对于 chuck 集成,状态将更改为 Stopped

camel get route
  PID   NAME     ID                     FROM                                 STATUS    AGE   TOTAL  FAILED  INFLIGHT  MEAN  MIN  MAX  SINCE-LAST
 81663  chuck    chuck                  kamelet://chuck-norris-source        Stopped           600       0         0     0    0    1          4s
 81663  chuck    chuck-norris-source-1  timer://chuck?period=10000           Stopped           600       0         0    65   52  290          4s
 81663  chuck    log-sink-2             kamelet://source?routeId=log-sink-2  Stopped           600       0         0     0    0    1          4s
 83415  bar      route1                 timer://yaml2?period=1000            Started  5m30s    329       0         0     0    0   10          0s
 83695  MyCamel  hello                  timer://hello?period=2000            Started  3m52s    116       0         0     0    0    9          1s
Copy to Clipboard Toggle word wrap

要启动路由,请运行:

camel cmd start-route chuck
Copy to Clipboard Toggle word wrap

要停止每个 Camel 集成中的所有路由,请使用 -- all 标志,如下所示:

camel cmd stop-route --all
Copy to Clipboard Toggle word wrap

要启动 所有路由,请使用:

camel cmd start-route --all
Copy to Clipboard Toggle word wrap
注意

您可以使用逗号分隔一个或多个路由来停止一个或多个路由,例如 camel cmd start-route --id=route1,hello。使用 camel cmd start-route --help 命令获取更多详细信息。

4.3.17.3. 配置日志记录级别

您可以通过以下方法查看正在运行的 Camel 集成的当前日志记录级别:

camel cmd logger
  PID   NAME   AGE   LOGGER  LEVEL
 90857  bar   2m48s  root    INFO
 91103  foo     20s  root    INFO
Copy to Clipboard Toggle word wrap

日志记录级别可以在运行时更改。例如,要将 foo 的级别改为 DEBUG,请运行:

camel cmd logger --level=DEBUG foo
Copy to Clipboard Toggle word wrap
注意

您可以使用 --all 更改所有正在运行的集成的日志级别。

4.3.17.4. 列出服务

有些 Camel 集成可以托管客户端可以使用 TCP 协议调用的服务,如 REST 或 SOAP-WS 或套接字级服务。您可以列出可用的服务,如下例所示:

camel get service
 PID   NAME       COMPONENT      PROTOCOL  SERVICE
 1912  netty      netty          tcp       tcp:localhost:4444
 2023  greetings  platform-http  rest      http://0.0.0.0:7777/camel/greetings/{name} (GET)
 2023  greetings  platform-http  http      http://0.0.0.0:7777/q/dev
Copy to Clipboard Toggle word wrap

在这里,您可以看到两个 Camel 集成。netty 集成托管端口 4444 上可用的 TCP 服务。其他 Camel 集成托管只能通过 GET 调用的 REST 服务。第三个集成附带嵌入式 Web 控制台(通过 --console 选项启动)。

注意

若要列出服务,Camel 组件必须能够使用 Camel 控制台 来 公告服务

4.3.17.4.1. 列出 Circuit Breakers 的状态

如果您的 Camel 集成使用 link:https://camel.apache.org/components/3.20.x/eips/circuitBreaker-eip.html [Circuit Breaker],您可以使用 Camel CLI 输出断器的状态,如下所示:

camel get circuit-breaker
  PID   NAME  COMPONENT     ROUTE   ID               STATE      PENDING  SUCCESS  FAIL  REJECT
 56033  mycb  resilience4j  route1  circuitBreaker1  HALF_OPEN        5        2     3       0
Copy to Clipboard Toggle word wrap

在这里,我们可以看到断路器处于 一半的开放 状态,即在故障开始丢弃时 breaker 试图过渡到关闭的状态。

注意

您可以使用 watch 选项运行 命令,以显示最新的状态,例如 watch camel get circuit-breaker

4.3.18. 使用管道从终端的脚本

您可以将 Camel CLI 文件作为脚本执行,该脚本用于通过管道和过滤器进行终端脚本。

注意

每次执行 JVM 时,都通过 Camel 启动脚本。这不适用于内存用量,因此请使用 Camel CLI 终端脚本,例如,使用许多 Camel 组件或 Kamelets 来更轻松地从不同的 IT 系统发送或接收数据。

这需要在文件顶部添加以下行,例如在 upper.yaml 文件中:

///usr/bin/env jbang --quiet camel@apache/camel pipe "$0" "$@" ; exit $?

# Will upper-case the input
- from:
    uri: "stream:in"
    steps:
      - setBody:
          simple: "${body.toUpperCase()}"
      - to: "stream:out"
Copy to Clipboard Toggle word wrap

要将其作为脚本执行,您需要设置执行文件权限:

chmod +x upper.yaml
Copy to Clipboard Toggle word wrap

然后您可以将其作为脚本执行:

echo "Hello\nWorld" | ./upper.yaml
Copy to Clipboard Toggle word wrap

这个输出:

HELLO
WORLD
Copy to Clipboard Toggle word wrap

您可以使用 --logging=true 打开日志,然后记录到 .camel-jbang/camel-pipe.log 文件。无法配置日志记录文件的名称。

echo "Hello\nWorld" | ./upper.yaml --logging=true
Copy to Clipboard Toggle word wrap

4.3.18.1. 使用 stream:in with line vs raw 模式

当使用 stream:inSystem 读取数据时流组件 以两种模式工作:

  • 行模式(默认)- 以单行形式读取输入(用换行符分开)。邮件正文 是一个字符串
  • raw 模式 - 读取整个流,直到 流 结束。邮件正文是一个 字节[]
注意

默认模式是因为过去是如何创建流组件造成的。因此,您可能希望将 stream:in?readLine=false 设置为使用 raw 模式。

4.3.19. 运行本地 Kamelets

您可以使用 Camel CLI 尝试本地 Kamelets,而无需将其发布到 GitHub 或以 jar 打包它们。

camel run --local-kamelet-dir=/path/to/local/kamelets earthquake.yaml
Copy to Clipboard Toggle word wrap
注意

当 kamelets 来自本地文件系统时,当以 --dev 模式运行 Camel CLI 时,可以实时重新加载它们。

您还可以指向 GitHub 存储库中的文件夹。例如:

camel run --local-kamelet-dir=https://github.com/apache/camel-kamelets-examples/tree/main/custom-kamelets user.java
Copy to Clipboard Toggle word wrap
注意

如果从 GitHub 加载了 kamelet,则无法实时迁移它们。

4.3.20. 使用 platform-http 组件

platform-http 启动路由时,Camel CLI 会自动包含在端口 8080 上运行的 VertX HTTP 服务器。以下示例显示了名为 server.yaml 文件中的路由:

- from:
    uri: "platform-http:/hello"
    steps:
      - set-body:
          constant: "Hello World"
Copy to Clipboard Toggle word wrap

您可以使用以下方法运行这个示例:

camel run server.yaml
Copy to Clipboard Toggle word wrap

然后使用以下方法调用 HTTP 服务:

$ curl http://localhost:8080/hello
Hello World%
Copy to Clipboard Toggle word wrap

4.3.21. 使用 Java Bean 和处理器

基本支持包括常规 Java 源文件以及 Camel 路由,并让 Camel CLI 运行时编译 Java 源。这意味着您可以包含更小的工具类、POJO、Camel Processors。

注意

Java 源文件无法使用软件包名称。

4.3.22. Java 类中的依赖注入

当运行 Camel 与 camel-jbang 的集成时,运行时会基于 camel-main。这意味着没有 Spring Boot 或 Quarkus 可用。但是,支持在 Java 类中使用基于注解的依赖项注入。

4.3.22.1. 使用 Spring Boot 依赖项注入

您可以使用以下 Spring Boot 注解:

  • @org.springframework.stereotype.Component@org.springframework.stereotype.Service on 类级别,以创建类的实例并在 Registry 中注册。
  • @org.springframework.beans.factory.annotation.Autowired 以在类字段中注入 bean。@org.springframework.beans.factory.annotation.Qualifier 可用于指定 bean id。
  • @org.springframework.beans.factory.annotation.Value 以注入 属性占位符。例如 application.properties 中定义的属性。
  • @org.springframework.context.annotation.Bean 在调用方法来创建 bean。

4.3.23. 调试

可用的调试有两种:

  • Java 调试 - Java 代码调试(标准 Java)
  • Camel 路由调试 - 调试 Camel 路由(需要 Camel 工具插件)

4.3.23.1. Java 调试

您可以使用 JBang 提供的 --debug 标志来调试集成脚本。但是,要在启动 JVM 时启用 Java 调试,请使用 jbang 命令,而不是 camel,如下所示:

jbang --debug  camel@apache/camel run hello.yaml
Listening for transport dt_socket at address: 4004
Copy to Clipboard Toggle word wrap

正如您所见,默认侦听端口为 4004,但可以按照 JBang 调试 中所述进行配置。

这是标准的 Java 调试套接字。然后您可以使用您选择的 IDE。您可以添加处理器,以在路由执行期间放置断点命中(而不是路由定义创建)。

4.3.23.2. Camel 路由调试

Camel 路由调试器默认可用( camel-debug 组件会自动添加到 classpath 中)。默认情况下,可以通过 URL 服务访问 JMX:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi/camel。然后,您可以使用您选择的集成开发环境(IDE)。

4.3.24. 健康检查

使用 Camel CLI 从 CLI 访问健康检查的状态,如下所示:

camel get health
  PID   NAME    AGE  ID             RL  STATE  RATE    SINCE   MESSAGE
 61005  mybind   8s  camel/context   R   UP    2/2/-  1s/3s/-
Copy to Clipboard Toggle word wrap

您可以在此处看到 Camel 为 UP。该应用已经运行 8 秒,并且调用了两个健康检查。

输出显示 默认 检查级别:

  • CamelContext 健康检查
  • 组件特定的健康检查(如 camel-kafkacamel-aws​)
  • 自定义健康检查
  • 任何不是 UP的检查

RATE 列显示三个数字,用 / 分隔。因此,2/2/- 表示共 2 个检查,2 个成功且没有失败。当健康检查更改状态时,两个列将重置,因为这个数字是成功或失败的连续检查数量。因此,如果健康检查开始失败,则数字可以是:

camel get health
  PID   NAME     AGE   ID             RL  STATE   RATE    SINCE    MESSAGE
 61005  mybind   3m2s  camel/context   R   UP    77/-/3  1s/-/17s  some kind of error
Copy to Clipboard Toggle word wrap

您可以在此处看到数字已更改为 77/-/3。这意味着检查的总数为 77。没有成功,但检查连续 3 次失败。SINCE 列与 RATE 对应。因此,在这种情况下,您可以看到最后的检查是 1 秒,并且检查在一行中已失败 17 秒。

您可以使用 --level=full 输出包含消费者和路由级别检查的每个健康检查。

健康检查可能会因为抛出异常而失败,这可使用 --trace 标志显示:

camel get health --trace
  PID   NAME      AGE   ID                                      RL  STATE    RATE       SINCE     MESSAGE
 61038  mykafka  6m19s  camel/context                            R   UP    187/187/-  1s/6m16s/-
 61038  mykafka  6m19s  camel/kafka-consumer-kafka-not-secure…   R  DOWN   187/-/187  1s/-/6m16s  KafkaConsumer is not ready - Error: Invalid url in bootstrap.servers: value


------------------------------------------------------------------------------------------------------------------------
                                                       STACK-TRACE
------------------------------------------------------------------------------------------------------------------------
    PID: 61038
    NAME: mykafka
    AGE: 6m19s
    CHECK-ID: camel/kafka-consumer-kafka-not-secured-source-1
    STATE: DOWN
    RATE: 187
    SINCE: 6m16s
    METADATA:
        bootstrap.servers = value
        group.id = 7d8117be-41b4-4c81-b4df-cf26b928d38a
        route.id = kafka-not-secured-source-1
        topic = value
    MESSAGE: KafkaConsumer is not ready - Error: Invalid url in bootstrap.servers: value
    org.apache.kafka.common.KafkaException: Failed to construct kafka consumer
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:823)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:664)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:645)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:625)
        at org.apache.camel.component.kafka.DefaultKafkaClientFactory.getConsumer(DefaultKafkaClientFactory.java:34)
        at org.apache.camel.component.kafka.KafkaFetchRecords.createConsumer(KafkaFetchRecords.java:241)
        at org.apache.camel.component.kafka.KafkaFetchRecords.createConsumerTask(KafkaFetchRecords.java:201)
        at org.apache.camel.support.task.ForegroundTask.run(ForegroundTask.java:123)
        at org.apache.camel.component.kafka.KafkaFetchRecords.run(KafkaFetchRecords.java:125)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: org.apache.kafka.common.config.ConfigException: Invalid url in bootstrap.servers: value
        at org.apache.kafka.clients.ClientUtils.parseAndValidateAddresses(ClientUtils.java:59)
        at org.apache.kafka.clients.ClientUtils.parseAndValidateAddresses(ClientUtils.java:48)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:730)
        ... 13 more
Copy to Clipboard Toggle word wrap

在这里,您可以看到由于 org.apache.kafka.common.config.ConfigException 导致健康检查失败,这源自无效的配置: Invalid url in bootstrap.servers: value

注意

使用 camel get health --help 查看所有各种选项。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat