4.3. 创建并运行 Camel 路由


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

camel init cheese.xml

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

要运行该文件,请运行:

camel run cheese.xml
注意

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

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

camel init foo.java

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

camel init foo.java --directory=foobar
注意

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

4.3.1. 从多个文件运行路由

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

camel run one.yaml two.yaml

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

camel run one.yaml hello.java

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

camel run *.yaml

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

camel run foo*

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

camel run *
注意

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

4.3.2. 从输入参数运行路由

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

camel run --code='from("kamelet:beer-source").to("log:beer")'

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

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

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

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

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

camel run foo.yaml --dev

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

camel run hello.java --dev
注意

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

4.3.4. 开发人员控制台

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

camel run hello.java --console

然后可以从 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/

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

curl -s -H "Accept: application/json"  http://0.0.0.0:8080/q/dev/top/ | jq

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

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

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

camel.main.streamCaching=false
camel.main.logMask=true

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

camel.component.kafka.brokers=broker1:9092,broker2:9092,broker3:9092
注意

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

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
To add a Camel dependency explicitly you can use a shorthand syntax (starting with `camel:` or `camel-`):
camel run foo.java --deps=camel-saxon

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

camel run foo.java --deps=camel-saxon,com.foo:acme:1.0

4.3.8. 使用第三方 Maven 存储库

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

camel run foo.java --repos=https://packages.atlassian.com/maven-external
注意

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

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

camel.jbang.repos=https://packages.atlassian.com/maven-external

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

camel run foo.java

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

camel run foo.java application.properties

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

camel run foo.java --profile=application

其中 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>

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

$ mvn -emp
Master password: camel
{hqXUuec2RowH8dA8vdqkF6jn4NU9ybOsDjuTmWvYj4U=}

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

<settingsSecurity>
  <master>{hqXUuec2RowH8dA8vdqkF6jn4NU9ybOsDjuTmWvYj4U=}</master>
</settingsSecurity>

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

$ mvn -ep
Password: camel
{SSVqy/PexxQHvubrWhdguYuG7HnTvHlaNr6g3dJn7nk=}

然后您可以在 < 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

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

camel run foo.java --maven-settings=false

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

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

camel run github:apache:camel-kamelets-examples:jbang/hello-java/Hey.java

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

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/hello-java

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

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/languages/*.groovy

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

camel run https://github.com/apache/camel-kamelets-examples/tree/main/jbang/languages/rou*

4.3.10.1. 从 GitHub gists 运行路由

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

camel run https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92

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

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

camel run *

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

camel init https://github.com/apache/camel-kamelets-examples/tree/main/jbang/dependency-injection --directory=myproject
注意

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

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

camel run * --dev

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

camel init https://github.com/apache/camel-k-examples/blob/main/generic-examples/languages/simple.groovy

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

camel run simple.groovy

4.3.11.1. 下载路由表单 GitHub gists

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

camel init https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92

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

camel run *

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

camel init https://gist.github.com/davsclaus/477ddff5cdeb1ae03619aa544ce47e92 --directory=foobar
注意

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

4.3.12. 使用特定的 Camel 版本

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

jbang run -Dcamel.jbang.version=4.0.0 camel@apache/camel [command]
注意

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

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

jbang run --fresh -Dcamel.jbang.version=4.0.0-SNAPSHOT camel@apache/camel [command]

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
camel run joke.yaml

4.3.14. 从剪贴板中运行

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

camel run clipboard.<extension>

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

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

<route>
  <from uri="timer:foo"/>
  <log message="Hello World"/>
</route>
camel run clipboard.xml

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

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

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

camel stop test1
Stopping running Camel integration (pid: 62506)

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

camel stop 62506
Stopping running Camel integration (pid: 62506)
注意

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

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

camel stop --all
Stopping running Camel integration (pid: 61818)
Stopping running Camel integration (pid: 62506)

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>

Quarkus

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

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

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

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/-
注意

使用 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

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
注意

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

4.3.17.2. 启动和停止路由

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

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

camel cmd stop-route chuck

然后,对于 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

要启动路由,请运行:

camel cmd start-route chuck

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

camel cmd stop-route --all

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

camel cmd start-route --all
注意

您可以使用逗号分隔一个或多个路由来停止一个或多个路由,例如 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

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

camel cmd logger --level=DEBUG foo
注意

您可以使用 --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

在这里,您可以看到两个 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

在这里,我们可以看到断路器处于 一半的开放 状态,即在故障开始丢弃时 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"

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

chmod +x upper.yaml

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

echo "Hello\nWorld" | ./upper.yaml

这个输出:

HELLO
WORLD

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

echo "Hello\nWorld" | ./upper.yaml --logging=true

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
注意

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

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

camel run --local-kamelet-dir=https://github.com/apache/camel-kamelets-examples/tree/main/custom-kamelets user.java
注意

如果从 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"

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

camel run server.yaml

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

$ curl http://localhost:8080/hello
Hello World%

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

正如您所见,默认侦听端口为 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/-

您可以在此处看到 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

您可以在此处看到数字已更改为 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

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

注意

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.