使用 Camel Extensions for Quarkus 开发应用程序
使用 Camel Extensions for Quarkus 开发应用程序
摘要
前言 复制链接链接已复制到粘贴板!
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 使用 Camel Extensions for Quarkus 开发应用程序简介 复制链接链接已复制到粘贴板!
本指南供开发人员在 Camel Extensions for Quarkus 之上编写 Camel 应用程序。
Camel Extensions for Quarkus 支持的 Camel 组件具有关联的 Camel 扩展用于 Quarkus 扩展。有关此发行版本中支持的 Camel Extensions for Quarkus 扩展的更多信息,请参阅 Camel Extensions for Quarkus 参考指南。
第 2 章 依赖项管理 复制链接链接已复制到粘贴板!
2.1. Quarkus 工具用于启动新项目 复制链接链接已复制到粘贴板!
特定的 Camel Extensions for Quarkus 发行版本应该只可用于特定的 Quarkus 版本。
在新项目中获取依赖项版本的最简单和最简单的方法是使用 Quarkus 工具之一:
- code.quarkus.redhat.com - 在线项目生成器,
- Quarkus Maven 插件
这些工具允许您选择扩展和构建新的 Maven 项目。
生成的 pom.xml 将类似如下:
可用的扩展范围于 Quarkus Core、Camel Quarkus 和几个其他第三方参与项目,如 Hazelcast、Cassandra、Kargito 和 OptaPlanner。
BOM 代表"Bill of Materials" - 这是一个 pom.xml,其主要目的是管理工件版本,以便最终用户在项目中导入 BOM,不需要关心哪个工件版本应该协同工作。换句话说,在 pom.xml 的 <depependencyManagement > 部分中导入了 BOM,可以避免为给定 BOM 管理的依赖项指定版本。
pom.xml 中包含的特定 BOM 取决于您使用配置的生成器工具选择一组最小一致 BOM 的扩展。
如果您选择在稍后添加扩展,它不由 pom.xml 文件中的任何 BOM 管理,则不需要手动搜索适当的 BOM。通过 quarkus-maven-plugin,您可以选择扩展,工具会根据需要添加适当的 BOM。您还可以使用 quarkus-maven-plugin 升级 BOM 版本。
com.redhat.quarkus.platform BOMs 相互一致,这意味着如果工件在多个 BOM 中管理,则始终使用同一版本进行管理。这具有应用程序开发人员不需要关心不同独立项目的不同工件的兼容性的优势。
第 3 章 定义 Camel 路由 复制链接链接已复制到粘贴板!
Camel Extensions for Quarkus 支持 Java DSL 语言来定义 Camel 路由。
3.1. Java DSL 复制链接链接已复制到粘贴板!
扩展 org.apache.camel.builder.RouteBuilder 并使用流畅的构建器方法可用,这是定义 Camel 路由的最常见方法。以下是使用 timer 组件的路由的简单示例:
3.1.1. 端点 DSL 复制链接链接已复制到粘贴板!
自 Camel 3.0 起,您也可以使用流畅的构建器来定义 Camel 端点。以下等同于上例:
所有 Camel 组件的构建器方法均可通过 camel-quarkus-core 提供,但您仍需要将指定组件的扩展作为依赖项来添加,以便路由正常工作。在上例中,它将是 camel-quarkus-timer。
第 4 章 配置 复制链接链接已复制到粘贴板!
Camel Quarkus 会自动配置和部署 Camel 上下文 bean,默认为根据 Quarkus 应用程序生命周期启动/停止。在 Quarkus 的增强阶段的构建期间配置步骤,它由 Camel Quarkus 扩展驱动,该扩展可以使用 Camel Quarkus 特定的 quarkus.camel.* 属性进行调优。
Quarkus .camel.* 配置属性记录在单个扩展页面中 - 例如,请参阅 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 to 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。
4.3. Metering 标签 复制链接链接已复制到粘贴板!
您可以在 OpenShift Container Platform 版本 4.8 及更早版本中使用 Metering Operator 将标签应用到 pod。从 4.9 开始,在没有直接替换的情况下,Metering Operator 不再可用。
不要将 metering 标签添加到 Operator 或模板部署和管理的任何 pod。
Camel Quarkus 可以使用以下 metering 标签:
-
com.company: Red_Hat -
rht.prod_name: Red_Hat_Integration -
rht.prod_ver: 2021.Q4 -
rht.comp: "Camel-Quarkus" -
rht.comp_ver: 2.2.0 -
rht.subcomp: {sub-component-name} -
rht.subcomp_t: application
第 5 章 Camel Quarkus 中的上下文和依赖注入(CDI) 复制链接链接已复制到粘贴板!
CDI 在 Quarkus 和 Camel Quarkus 中扮演了一个中央角色,它还提供了第一个类支持。
您可以使用 @Inject、@ConfigProperty 和类似的注解,例如,将 Bean 和配置值注入 Camel RouteBuilder,例如:
- 1
@ApplicationScoped注释需要@Inject和@ConfigProperty才能在RouteBuilder中工作。请注意,@ApplicationScopedBean 由 CDI 容器管理,其生命周期比普通RouteBuilder之一更复杂。换句话说,在RouteBuilder中使用@ApplicationScoped有一定的引导时间损失,因此您应该仅在真正需要时使用@ApplicationScoped标注您的RouteBuilder。- 2
timer.period属性的值在 example 项目的src/main/resources/application.properties中定义。
如需了解更多详细信息,请参阅 Quarkus 依赖注入指南。
5.1. 访问 CamelContext 复制链接链接已复制到粘贴板!
访问 CamelContext 只是将其注入到 bean 中:
5.2. CDI 和 Camel Bean 组件 复制链接链接已复制到粘贴板!
5.2.1. 按名称引用 bean 复制链接链接已复制到粘贴板!
要按名称引用路由定义中的 bean,请使用 @Named ("myNamedBean") 和 @ApplicationScoped 标注 bean。@RegisterForReflection 注释对于原生模式很重要。
然后您可以在路由定义中使用 myNamedBean 名称:
第 6 章 Observability(可观察性) 复制链接链接已复制到粘贴板!
6.1. 健康和存活度检查 复制链接链接已复制到粘贴板!
MicroProfile Health 扩展支持健康和存活度检查。
它们可以通过 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 抛出,请将以下条目添加到 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_* 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. include 和 resources.excludes 都是用逗号分开的 Ant-path 样式 glob 模式的列表。
如需了解更多详细信息,请参阅 Camel Extensions for Quarkus Reference。
7.4. 在原生模式中使用 onException 子句 复制链接链接已复制到粘贴板!
当在原生模式中使用Exception 处理时,应用程序开发人员负责注册异常类来反映。
例如,有一个 camel 上下文,其中包含 onException 处理,如下所示:
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 进行反映,请参阅 Registering class for reflection。
7.5. 注册课程以反应 复制链接链接已复制到粘贴板!
默认情况下,动态反映在原生模式中不可用。需要反复访问的课程,以便在编译时进行反复注册。
在很多情况下,应用程序开发人员不需要关注,因为 Quarkus 扩展可以检测需要反映的类并自动注册它们。
然而,在某些情况下,Quarkus 扩展可能会错过一些类,由应用程序开发人员注册。有两种方法可以做到这一点:
-
@io.quarkus.runtime.annotations.RegisterForReflection注释可用于注册所使用的类,或者通过targets属性注册第三方类。 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' - e.g 中的 'quarkus.index-dependency.*' 选项进行索引注册。
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) 注册更多类。