使用红帽构建的 Apache Camel for Quarkus 开发应用程序
使用红帽构建的 Apache Camel for Quarkus 开发应用程序
摘要
前言 复制链接链接已复制到粘贴板!
提供有关红帽构建的 Apache Camel 文档的反馈
要报告错误或改进文档,请登录到 Red Hat JIRA 帐户并提交问题。如果您没有 Red Hat Jira 帐户,则会提示您创建一个帐户。
流程
- 点击以下链接 创建 ticket
- 在 Summary 中输入问题的简短描述。
- 在 Description 中提供问题或功能增强的详细描述。包括一个指向文档中问题的 URL。
- 点 Submit 创建问题,并将问题路由到适当的文档团队。
第 1 章 使用红帽构建的 Apache Camel for Quarkus 开发应用程序简介 复制链接链接已复制到粘贴板!
本指南适用于在红帽构建的 Apache Camel for Quarkus 上编写 Camel 应用程序的开发人员。
Red Hat build of Apache Camel for Quarkus 支持的 Camel 组件有一个关联的红帽构建的 Apache Camel for Quarkus 扩展。有关此发行版本支持的红帽构建的 Apache Camel for Quarkus 扩展的更多信息,请参阅 Red Hat build of Apache Camel for Quarkus Extensions 指南。
第 2 章 依赖项管理 复制链接链接已复制到粘贴板!
特定的 Red Hat build of Apache Camel for Quarkus 发行版本应该只适用于特定的 Quarkus 发行版本。
2.1. 用于启动新项目的 Quarkus 工具 复制链接链接已复制到粘贴板!
在新项目中获取依赖项版本的最简单且最简单的方法是使用 Quarkus 工具之一:
- code.quarkus.redhat.com - an online project generator,
- Quarkus Maven 插件
这些工具允许您选择扩展并构建新的 Maven 项目。
可用的扩展范围跨越 Quarkus Core、Camel Quarkus 和其他几个第三方参与项目,如 Hazelcast、Cassandra、Kogito 和 OptaPlanner。
生成的 pom.xml 类似如下:
BOM 代表 "Bill of Materials" - 它是 pom.xml,其主要目的是管理工件版本,以便最终用户在其项目中导入 BOM 时不需要处理哪些特定版本应该一起工作。换句话说,在 pom.xml 的 & lt;depependencyManagement > 部分中导入了一个 BOM,您可以避免为给定 BOM 管理的依赖项指定版本。
哪些特定的 BOM 最终在 pom.xml 文件中取决于您在生成器工具中选择的扩展。生成器工具需要注意选择最小一致的集合。
如果您选择稍后添加扩展,该扩展不由 pom.xml 文件中的任何 BOM 管理,则不需要手动搜索适当的 BOM。
使用 quarkus-maven-plugin,您可以选择扩展,工具则根据需要添加适当的 BOM。您还可以使用 quarkus-maven-plugin 升级 BOM 版本。
com.redhat.quarkus.platform BOMs 相互一致,这意味着如果工件在多个 BOM 中管理,它总是使用相同的版本进行管理。这使应用程序开发人员不需要注意可能来自不同独立项目的单个工件的兼容性。
2.2. 与其他 BOM 结合使用 复制链接链接已复制到粘贴板!
将 camel-quarkus-bom 与任何其他 BOM 结合使用时,请仔细考虑导入它们的顺序,因为导入顺序定义了优先级。
例如,如果在 camel-quarkus-bom 之前导入 my-foo-bom,则 my-foo-bom 中定义的版本将具有优先权。这可能不是您想要的,具体取决于 my-foo-bom 和 camel-quarkus-bom 之间是否存在重叠,具体取决于那些具有较高优先级的版本是否与 camel-quarkus-bom 中管理的其余工件一起工作。
第 3 章 定义 Camel 路由 复制链接链接已复制到粘贴板!
在 Red Hat build of Apache Camel for Quarkus 中,您可以使用以下语言定义 Camel 路由:
3.1. Java DSL 复制链接链接已复制到粘贴板!
扩展 org.apache.camel.builder.RouteBuilder 并使用 fluent builder 方法,这是定义 Camel 路由的最常见方法。以下是使用计时器组件的路由的简单示例:
3.2. Endpoint DSL 复制链接链接已复制到粘贴板!
自 Camel 3.0 起,您还可以使用流畅的构建器来定义 Camel 端点。以下示例等同于上一个示例:
所有 Camel 组件的构建器方法都通过 camel-quarkus-core 提供,但您仍需要添加给定组件的扩展作为路由正常工作的依赖项。如果是上例,它会是 camel-quarkus-timer。
3.3. XML IO DSL 复制链接链接已复制到粘贴板!
要在 XML 中配置 Camel 路由、剩余部分或模板,您必须在 classpath 中添加 Camel XML 解析器依赖项。自 Camel Quarkus 1.8.0 起,链接:https://access.redhat.com/documentation/zh-cn/red_hat_build_of_apache_camel/4.4/html-single/red_hat_build_of_apache_camel_for_quarkus_reference/ @extensions-xml-io-dsl[camel-quarkus-xml-io-dsl] 是最佳选择。
使用 Camel Main,您可以设置指向资源 XML 文件的位置的属性,如路由、REST DSL 和 Route 模板 :
camel.main.routes-include-pattern = routes/routes.xml, file:src/main/routes/rests.xml, file:src/main/rests/route-template.xml
camel.main.routes-include-pattern = routes/routes.xml, file:src/main/routes/rests.xml, file:src/main/rests/route-template.xml
path globbing like camel.main.routes-include-pattern = pre/routes.xml 目前无法在原生模式下工作。
Route
当将 XML 路由与 Bean 搭配使用时,有时需要引用类名称,用于实例 beanType=org.apache.SomeClass。在这种情况下,可能需要注册类以在原生模式中反映。如需更多信息 ,请参阅原生模式 部分。
不支持带有 < ;beans> 或带有 & lt;blueprint& gt; 元素的蓝图 XML。
路由 XML 应该位于简化的版本中,如下所示:
REST DSL
路由模板
3.4. YAML DSL 复制链接链接已复制到粘贴板!
要使用 YAML 配置路由,您必须将 camel-quarkus-yaml-dsl 依赖项添加到 classpath 中。
使用 Camel Main,您可以设置指向包含路由、REST DSL 和 Route 模板 定义的 YAML 文件的位置的属性:
camel.main.routes-include-pattern = routes/routes.yaml, routes/rests.yaml, rests/route-template.yaml
camel.main.routes-include-pattern = routes/routes.yaml, routes/rests.yaml, rests/route-template.yaml
Route
REST DSL
路由模板
第 4 章 配置 复制链接链接已复制到粘贴板!
Camel Quarkus 会自动配置和部署 Camel Context bean,它默认根据 Quarkus 应用程序生命周期启动/停止。配置步骤在 Quarkus 的增强阶段进行,由 Camel Quarkus 扩展驱动,该扩展可以使用 Camel Quarkus 特定的 quarkus.camel prerequisites 属性进行调优。
quarkus.camel prerequisites 配置属性记录在单独的扩展页面中 - 例如,请参阅 Camel Quarkus Core。
配置完成后,会在 RUNTIME_INIT 阶段编译并启动最小的 Camel Runtime。
4.1. 配置 Camel 组件 复制链接链接已复制到粘贴板!
4.1.1. application.properties 复制链接链接已复制到粘贴板!
要通过属性配置 Apache Camel 组件和其他方面,请确保您的应用程序直接依赖于 camel-quarkus-core 或 传输。因为大多数 Camel Quarkus 扩展都依赖于 camel-quarkus-core,因此通常不需要显式添加它。
camel-quarkus-core 将功能从 Camel Main 引入到 Camel Quarkus。
在以下示例中,您可以通过 application.properties 在 LogComponent 中设置特定的 ExchangeFormatter 配置:
camel.component.log.exchange-formatter = #class:org.apache.camel.support.processor.DefaultExchangeFormatter camel.component.log.exchange-formatter.show-exchange-pattern = false camel.component.log.exchange-formatter.show-body-type = false
camel.component.log.exchange-formatter = #class:org.apache.camel.support.processor.DefaultExchangeFormatter
camel.component.log.exchange-formatter.show-exchange-pattern = false
camel.component.log.exchange-formatter.show-body-type = false
4.1.2. CDI 复制链接链接已复制到粘贴板!
您还可以使用 CDI 以编程方式配置组件。
推荐的方法是观察 ComponentAddEvent,并在路由和 CamelContext 启动前配置组件:
4.1.2.1. 生成 @Named 组件实例 复制链接链接已复制到粘贴板!
或者,您也可以使用 @Named producer 方法创建和配置组件。这作为 Camel 使用组件 URI 方案从其 registry 中查找组件。例如,如果是 LogComponent Camel 会查找名为 bean 的日志。
虽然生成 @Named 组件 bean 通常可以正常工作,但可能会导致一些组件出现问题。
Camel Quarkus 扩展可以执行以下操作之一或多个:
- 传递默认 Camel 组件类型的自定义子类型。请参阅 Vert.x WebSocket 扩展 示例。
- 对组件执行一些特定于 Quarkus 的自定义。请参阅 JPA 扩展 示例。
当您生成自己的组件实例时,不会执行这些操作,因此推荐在观察器方法中配置组件。
- 1
- 如果方法的名称相同,则可以省略
@Named注释的"log"参数。
4.2. 根据惯例的配置 复制链接链接已复制到粘贴板!
除了支持通过属性配置 Camel 外,camel-quarkus-core 还允许您使用约定来配置 Camel 行为。例如,如果 CDI 容器中有一个 ExchangeFormatter 实例,则它将自动将 bean 链接到 LogComponent。
第 5 章 Camel Quarkus 中的上下文和依赖注入(CDI) 复制链接链接已复制到粘贴板!
CDI 在 Quarkus 中扮演了一个中央角色,而 Camel Quarkus 也为它提供了第一类支持。
您可以使用 @Inject、@ConfigProperty 和类似注解(例如,将 bean 和配置值注入 Camel RouteBuilder ),例如:
- 1
@ApplicationScoped注释需要@Inject和@ConfigProperty,才能在RouteBuilder中工作。请注意,@ApplicationScopedBean 由 CDI 容器管理,其生命周期比其中一个纯文本RouteBuilder更复杂。换句话说,在RouteBuilder中使用会有一些引导时间损失,因此,您应该仅在需要时为@ApplicationScopedRouteBuilder标注。- 2
timer.period属性的值在 example 项目的src/main/resources/application.properties中定义。
如需了解更多详细信息,请参阅 Quarkus Dependency Injection 指南。
5.1. 访问 CamelContext 复制链接链接已复制到粘贴板!
要访问 CamelContext,只需将其注入您的 bean:
5.2. @EndpointInject and @Produce 复制链接链接已复制到粘贴板!
如果您使用 @org.apache.camel.EndpointInject 和 @org.apache.camel.Produce from 普通 Camel 或 SpringBoot 上的 Camel,您也可以继续在 Quarkus 上使用它们。
org.apache.camel.quarkus:camel-quarkus-core 支持以下用例:
您可以使用任何其他 Camel producer 端点 URI 而不是 direct:myDirect*。
setter 方法不支持 @EndpointInject 和 @Produce - 请参阅 #2579
org.apache.camel.quarkus:camel-quarkus-bean 支持以下用例:
5.3. CDI 和 Camel Bean 组件 复制链接链接已复制到粘贴板!
5.3.1. 按名称引用 bean 复制链接链接已复制到粘贴板!
要按名称引用路由定义中的 bean,只需为 bean标上 @Named ("myNamedBean") 和 @ApplicationScoped (或其他支持范围)。https://quarkus.io/guides/cdi-reference#supported_features@RegisterForReflection 注释对于原生模式非常重要。
然后,您可以在路由定义中使用 myNamedBean 名称:
作为 @Named 的替代选择,您也可以使用 io.smallrye.common.annotation.Identifier 来命名并识别 bean。
然后引用 Camel 路由中的标识符值:
5.3.2. @Consume 复制链接链接已复制到粘贴板!
自 Camel Quarkus 2.0.0 起,camel-quarkus-bean 工件支持 @org.apache.camel.Consume - 请参阅 Camel 文档的 Pojo consuming 部分。
声明类,如下所示
将自动创建以下 Camel 路由
from("activemq:cheese").bean("foo1234", "onCheese")
from("activemq:cheese").bean("foo1234", "onCheese")
适用于您的.请注意,Camel Quarkus 将隐式地将 @jakarta.inject.Singleton 和 jakarta.inject.Named ("foo1234") 添加到 bean 类,其中 1234 是从完全限定类名称获取的哈希值代码。如果您的 bean 设置了一些 CDI 范围(如 @ApplicationScoped)或 @Named ("someName"),则会在自动创建的路由中遵守这些范围。
第 6 章 Observability(可观察性) 复制链接链接已复制到粘贴板!
6.1. 健康和存活度检查 复制链接链接已复制到粘贴板!
MicroProfile 健康 扩展支持健康和存活度检查。它们可以通过 Camel Health API 或 Quarkus MicroProfile Health 进行配置。
所有配置的检查都在标准 MicroProfile Health 端点 URL 上提供:
6.2. 指标 复制链接链接已复制到粘贴板!
我们提供 MicroProfile 指标 以公开指标。
为您提供了一些基本的 Camel 指标,可以通过在路由中配置其他指标来补充这些指标。
指标在标准 Quarkus 指标端点上提供:
第 7 章 原生模式 复制链接链接已复制到粘贴板!
有关以原生模式编译和测试应用程序的更多信息,请参阅 Compiling your Quarkus applications to native executables 指南中的 Producing a native executable。
7.1. 字符编码 复制链接链接已复制到粘贴板!
默认情况下,并非所有 Charsets 都以原生模式提供。
Charset.defaultCharset(), US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16
Charset.defaultCharset(), US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16
如果您希望您的应用程序需要没有包括在这个集合中的编码,或者在原生模式下看到 UnsupportedCharsetException thrown,请将以下条目添加到 application.properties 中:
quarkus.native.add-all-charsets = true
quarkus.native.add-all-charsets = true
另请参阅 Quarkus 文档中的 quarkus.native.add-all-charsets。
7.2. Locale 复制链接链接已复制到粘贴板!
默认情况下,原生镜像中仅包含构建 JVM 默认区域设置。Quarkus 提供了一种通过 application.properties 设置区域的方法,因此您不需要依赖 LANG 和 LC ptr environement 变量:
quarkus.native.user-country=US quarkus.native.user-language=en
quarkus.native.user-country=US
quarkus.native.user-language=en
还支持将多个区域嵌入到原生镜像中,并通过 Mandrel 命令行选项选择默认区域设置 -H:IncludeLocales=fr,en,H:+IncludeAllLocales 和 -H:DefaultLocale=de。您可以通过 Quarkus quarkus.native.additional-build-args 属性设置它们。
7.3. 将资源嵌入到原生可执行文件中 复制链接链接已复制到粘贴板!
通过 Class.getResource (), Class.getResourceAsStream (), ClassLoader.getResource (),, ClassLoader.getResourceAsStream () 等访问的资源需要在运行时明确列出,以包括在原生可执行文件中。
这可以通过在 application.properties 文件中使用 Quarkus quarkus.native.resources.includes 和 quarkus.native.resources.excludes 属性来完成,如下所示:
quarkus.native.resources.includes = docs/*,images/* quarkus.native.resources.excludes = docs/ignored.adoc,images/ignored.png
quarkus.native.resources.includes = docs/*,images/*
quarkus.native.resources.excludes = docs/ignored.adoc,images/ignored.png
在上例中,名为 docs/included.adoc 和 images/included.png 的资源将被嵌入到原生可执行文件中,而 docs/ignored.adoc 和 images/ignored.png 不会被嵌入到。
resources.includes 和 resources.excludes 都是用逗号分开的 Ant 路径 glob 模式的列表。
如需了解更多详细信息,请参阅 红帽构建的 Apache Camel for Quarkus 扩展 参考。
7.4. 在原生模式中使用 onException 子句 复制链接链接已复制到粘贴板!
在原生模式中使用 Camel onException 处理 时,您负责注册异常类来反映。
例如,具有带有 onException 处理的 camel 上下文:
onException(MyException.class).handled(true);
from("direct:route-that-could-produce-my-exception").throw(MyException.class);
onException(MyException.class).handled(true);
from("direct:route-that-could-produce-my-exception").throw(MyException.class);
应当注册 mypackage.MyException 类来反映。如需更多信息,请参阅 注册类以了解反映。
7.5. 注册课程来反映 复制链接链接已复制到粘贴板!
默认情况下,动态反映在原生模式中不可用。需要反映访问的类,必须在编译时注册以反应。
在很多情况下,应用程序开发人员不需要小心,因为 Quarkus 扩展可以检测需要反映的类并自动注册它们。
然而,在某些情况下,Quarkus 扩展可能会错过一些类,它取决于应用程序开发人员进行注册。有两种方法可以做到这一点:
@io.quarkus.runtime.annotations.RegisterForReflection注释可用于注册所使用的类,或者通过targets属性注册第三方类。Copy to Clipboard Copied! Toggle word wrap Toggle overflow application.properties中的quarkus.camel.native.reflection选项:quarkus.camel.native.reflection.include-patterns = org.apache.commons.lang3.tuple.* quarkus.camel.native.reflection.exclude-patterns = org.apache.commons.lang3.tuple.*Triple
quarkus.camel.native.reflection.include-patterns = org.apache.commons.lang3.tuple.* quarkus.camel.native.reflection.exclude-patterns = org.apache.commons.lang3.tuple.*TripleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要使这些选项正常工作,包含所选类的工件必须包含 Jandex 索引('META-INF/jandex.idx'),或者必须使用 'application.properties' 中的 'quarkus.index-dependencyAPPEND' 选项进行索引注册,例如:
quarkus.index-dependency.commons-lang3.group-id = org.apache.commons quarkus.index-dependency.commons-lang3.artifact-id = commons-lang3
quarkus.index-dependency.commons-lang3.group-id = org.apache.commons quarkus.index-dependency.commons-lang3.artifact-id = commons-lang3Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6. 注册类进行序列化 复制链接链接已复制到粘贴板!
如果通过 quarkus.camel.native.reflection.serialization-enabled 来请求序列化支持,则 CamelSerializationProcessor.BASE_SERIALIZATION_CLASSES 中列出的类会自动注册以便序列化。
您可以使用 @RegisterForReflection (serialization = true) 注册更多类。
第 8 章 Kubernetes 复制链接链接已复制到粘贴板!
本指南描述了在 kubernetes 上配置和部署 Camel Quarkus 应用程序的不同方法。它还描述了 Knative 和 Service Binding 的一些特定用例。
8.1. Kubernetes 复制链接链接已复制到粘贴板!
Quarkus 支持为 vanilla Kubernetes、OpenShift 和 Knative 生成资源。另外,Quarkus 通过将生成的清单应用到目标集群的 API 服务器,将应用程序部署到目标 Kubernetes 集群。如需更多信息,请参阅 Quarkus Kubernetes 指南。
8.2. knative 复制链接链接已复制到粘贴板!
消费者支持 Knative 部署的 Camel Quarkus 扩展是:
8.3. 服务绑定 复制链接链接已复制到粘贴板!
Quarkus 还支持 Kubernetes 的 Service Binding 规格 将服务绑定到应用程序。
以下 Camel Quarkus 扩展可用于 Service Binding: