3.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 会自动清理此目录。

3.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

您可以使用通配符(i.e. 114)来匹配多个文件,如运行所有 yaml 文件:

camel run *.yaml
Copy to Clipboard Toggle word wrap

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

camel run foo*
Copy to Clipboard Toggle word wrap

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

camel run *
Copy to Clipboard Toggle word wrap
注意

运行 目标也可以检测属于 属性 的文件,如 application.properties

3.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 仅适用于非常快速和小的站。

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

您可以使用 --dev 选项启用源文件更新(保存)时与路由实时重新载入相关的 dev 模式,如下所示:

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

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

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

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

3.3.4. 开发人员控制台

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

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

然后可从位于 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,可以格式化并输出 JSON 数据,请运行:

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

3.3.5. 使用配置集

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

例如,使用名为 local 的配置集运行意味着 Camel JBang 将加载 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 JBang 内部使用的键,并允许 Camel JBang 命令的预配置参数。

3.3.6. 通过互联网下载 JAR

默认情况下,Camel JBang 会自动解决运行 Camel 所需的依赖项,这由 JBang 和 Camel 分别完成。如果组件需要 JARs,则 Camel 本身会在 classpath 上不可用,然后可以自动下载 JAR。

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

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

如果您不希望 Camel JBang 访问互联网下载,您可以使用 --download 选项关闭,如下所示:

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

3.3.7. 添加自定义 JAR

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

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

3.3.8. 使用第三方 Maven 存储库

Camel JBang 首先从本地存储库下载,然后从在线 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

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

3.3.9. 配置 Maven 用法

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

Maven 存储库可以使用 authentication 和 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> 配置中使用 这个密码。

默认情况下,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

3.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 JBang 运行示例:

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

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

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

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

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

3.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 JBang 将收集所有相关文件,因此 gist 可以包含多个路由、属性文件和 Java Bean。

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

您可以使用 Camel JBang 将现有示例从 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 路由,您可以使用该路由运行(或使用 groovy 路由):

camel run simple.groovy
Copy to Clipboard Toggle word wrap

3.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 会自动清理此目录。

3.3.12. 使用特定的 Camel 版本

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

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

旧版本的 Camel 可能也不适用于 Camel JBang 作为最新版本。建议使用从 Camel 3.18 开始的版本。

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

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

3.3.13. 运行 Camel K 集成或绑定

Camel 支持运行名为 joke.yaml 的 kamelet 绑定文件,它们采用 CRD 格式(Kubernetes 自定义资源定义)。例如,运行名为 joke.yaml 的 kamelet 绑定文件:

#!/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

3.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

3.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

3.3.16. 控制 Spring Boot 和 Quarkus 集成

默认情况下,Camel JBang 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

3.3.17. 获取 Camel 集成的状态

Camel JBang 中的 get 命令用于获取一个或多个正在运行的 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 显示所有可用的命令。

3.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 列显示堆内存(使用/提交/最大)和非堆(使用/提交)。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 显示所有可用的命令。

3.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 命令。

3.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 来更改所有正在运行的集成的日志级别。

3.3.17.4. 列出服务

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

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 集成托管一个 TCP 服务,可在端口 4444 上可用。其他 Camel 集成托管 REST 服务,只能通过 GET 调用。第三个集成附带嵌入式 Web 控制台(通过 --console 选项开始)。

注意

要使服务列出 Camel 组件必须能够使用 Camel Console 公告服务。

3.3.17.5. 列出 Circuit Breakers 的状态

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

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

在这里,我们可以看到断路器处于 半打开 状态,如果失败开始丢弃,则上游社区试图过渡到关闭的状态。

注意

您可以使用 watch 选项运行命令来显示最新的状态,例如 watch camel getbreaker getbreaker

3.3.18. 使用 Jolokia 和 Hawtio

Web 控制台允许检查运行 Camel 集成,如所有 JMX 管理信息,而不是至少视觉化使用实时性能指标的 Camel 路由。

要允许 Hawtio 检查 Camel 集成,必须在正在运行的集成中安装 Jolokia JVM 代理。这是明确完成的,如下所示:

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

使用 PID,您可以附加 Jolokia:

camel jolokia 62506
Started Jolokia for PID 62506
http://127.0.0.1:8778/jolokia/
Copy to Clipboard Toggle word wrap

您也可以使用名称模式附加 PID,而不必使用 PID。在这个示例中,两个 Camel 集成具有唯一的名称(foo 和 test1),您可以在没有 PID 的情况下附加 Jolokia,如下所示:

camel jolokia te
Started Jolokia for PID 62506
http://127.0.0.1:8778/jolokia/
Copy to Clipboard Toggle word wrap

然后,您可以使用 Camel JBang 启动 Hawtio:

camel hawtio
Copy to Clipboard Toggle word wrap

这将自动下载并启动 Hawtio,然后在 Web 浏览器中打开。

注意

如需了解更多选项,请参阅 camel hawtio --help

在 Web 浏览器中启动 Hawtio 时,单击 Discover 选项卡,该选项卡将列出所有本地可用的 Jolokia Agent。您可以使用 camel jolokia PID 连接到多个不同的 Camel 集成,从此列表中选择要加载哪些。

单击绿色 lightning 图标,以连接到特定正在运行的 Camel 集成。

如果不再需要,您可以在正在运行的 Camel 集成中卸载 Jolokia JVM 代理:

camel jolokia 62506 --stop
Stopped Jolokia for PID 62506
Copy to Clipboard Toggle word wrap

也可以使用一个命令达到此目的,如下所示:

camel hawtio test1
Copy to Clipboard Toggle word wrap

其中 test1 是正在运行的 Camel 集成的名称。当您停止 Hawtio (使用 ctrl + c),然后 Camel 将尝试卸载 Jolokia JVM 代理,但这不会成功,因为 JVM 会被终止,从而防止 camel-jbang 执行 JVM 进程与正在运行的 Camel 集成通信。

3.3.19. 使用管道在终端中脚本

您可以执行 Camel JBang 文件作为脚本,该脚本用于带有管道和过滤器的终端脚本。

注意

每次执行 JVM 时,每次使用 Camel 启动脚本时。这在内存用量上不是非常快或低的,因此请使用 Camel JBang 终端脚本,例如,使用许多 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

3.3.19.1. 使用带有行和原始模式的 stream:in

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

  • 行模式(默认)- 以单行形式读取输入(按换行符分隔)。消息正文 是一个字符串
  • 原始模式 - 读取整个流,直到 流结束。消息正文是 byte[]
注意

默认模式是过去的创建流组件的创建方式。因此,您可能想要将 stream:in?readline=false 设置为使用原始模式。

3.3.20. 运行本地 Kamelets

您可以使用 Camel JBang 尝试本地 Kamelets,而无需在 GitHub 上发布它们,或者将它们打包到 jar 中。

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

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

您还可以指向 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,则无法实时重新加载。

3.3.21. 使用 platform-http 组件

当从 platform-http 启动路由时,Camel JBang 会自动包含运行在端口 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

3.3.22. 使用 Java Bean 和处理器

支持将常规 Java 源文件与 Camel 路由一起包含,并让 Camel JBang 运行时编译 Java 源。这意味着您可以包括较小的实用程序类、POJO、Camel Processors。

注意

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

3.3.23. Java 类中的依赖关系注入

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

3.3.23.1. 使用 Spring Boot 依赖项注入

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

  • @org.springframework.stereotype.Component@org.springframework.stereotype.Service 在类级别上创建类实例并在 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 的方法。

3.3.24. 调试

有两种类型的调试:

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

3.3.24.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。您可以添加处理器以在路由执行过程中放置断点命中(而不是路由定义创建)。

3.3.24.2. Camel 路由调试

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

3.3.25. 健康检查

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

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,这是因为因为 bootstrap.servers: value 无效配置无效: Invalid url in bootstrap.servers: value

注意

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat