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:
-
来自
~/.m2/repository
中的本地磁盘 - 来自 Maven Central 的互联网
- 从互联网的自定义第三方 Maven 存储库
-
从
~/.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>
; 配置中使用此密码。
默认情况下,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>
,是剪贴板内容的类型,如 java
、xml
或 yaml
。
例如,您可以将它复制到剪贴板,然后运行路由:
<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 integrations
或 camel 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:in
从 System 读取数据时
,流组件 以两种模式工作:
-
行模式(默认)- 以单行形式读取输入(用换行符分开)。邮件正文
是一个字符串
。 -
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-kafka
或camel-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
查看所有各种选项。