使用 Camel Extensions for Quarkus 开发应用程序


Red Hat Integration 2023.q1

使用 Camel Extensions for Quarkus 开发应用程序

Integration Documentation Team Integration Support Team http://access.redhat.com/support

摘要

本指南供开发人员在 Camel Extensions for Quarkus 之上编写 Camel 应用程序。

前言

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

本指南供开发人员在 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 工具之一:

这些工具允许您选择扩展和构建新的 Maven 项目。

生成的 pom.xml 将类似如下:

<project>
  ...
  <properties>
    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>com.redhat.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>
        <!-- The latest 2.13.x version from https://maven.repository.redhat.com/ga/com/redhat/quarkus/platform/quarkus-bom -->
    </quarkus.platform.version>
    ...
  </properties>
  <dependencyManagement>
    <dependencies>
      <!-- The BOMs managing the dependency versions -->
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-bom</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-camel-bom</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- The extensions you chose in the project generator tool -->
    <dependency>
      <groupId>org.apache.camel.quarkus</groupId>
      <artifactId>camel-quarkus-sql</artifactId>
      <!-- No explicit version required here and below -->
    </dependency>
    ...
  </dependencies>
  ...
</project>
Copy to Clipboard Toggle word wrap
提示

可用的扩展范围于 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 组件的路由的简单示例:

import org.apache.camel.builder.RouteBuilder;

public class TimerRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer:foo?period=1000")
                .log("Hello World");
    }
}
Copy to Clipboard Toggle word wrap

3.1.1. 端点 DSL

自 Camel 3.0 起,您也可以使用流畅的构建器来定义 Camel 端点。以下等同于上例:

import org.apache.camel.builder.RouteBuilder;
import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.timer;

public class TimerRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from(timer("foo").period(1000))
                .log("Hello World");
    }
}
Copy to Clipboard Toggle word wrap
注意

所有 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.propertiesLogComponent 上设置特定的 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
Copy to Clipboard Toggle word wrap

4.1.2. CDI

您还可以以编程方式使用 CDI 配置组件。

推荐的方法是观察 ComponentAddEvent,并在路由和 CamelContext 启动前配置组件:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import org.apache.camel.quarkus.core.events.ComponentAddEvent;
import org.apache.camel.component.log.LogComponent;
import org.apache.camel.support.processor.DefaultExchangeFormatter;

@ApplicationScoped
public static class EventHandler {
    public void onComponentAdd(@Observes ComponentAddEvent event) {
        if (event.getComponent() instanceof LogComponent) {
            /* Perform some custom configuration of the component */
            LogComponent logComponent = ((LogComponent) event.getComponent());
            DefaultExchangeFormatter formatter = new DefaultExchangeFormatter();
            formatter.setShowExchangePattern(false);
            formatter.setShowBodyType(false);
            logComponent.setExchangeFormatter(formatter);
        }
    }
}
Copy to Clipboard Toggle word wrap
4.1.2.1. 生成 @Named 组件实例

或者,您也可以使用 @Named producer 方法创建和配置组件。这与 Camel 使用组件 URI 方案从其 registry 中查找组件。例如,如果是 LogComponent Camel,则查找名为 bean 的日志

警告

请注意,在生成 @Named 组件 Bean 时,通常会正常工作,但可能会导致某些组件出现小的问题。

Camel Quarkus 扩展可以执行以下操作之一或多个:

  • 传递默认 Camel 组件类型的自定义子类型。请参阅 Vert.x WebSocket 扩展 示例。
  • 对组件执行一些特定于 Quarkus 的自定义。请参阅 JPA 扩展 示例。

当您生成自己的组件实例时,建议不要执行这些操作,因此推荐使用观察器方法配置组件。

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

import org.apache.camel.component.log.LogComponent;
import org.apache.camel.support.processor.DefaultExchangeFormatter;

@ApplicationScoped
public class Configurations {
    /**
     * Produces a {@link LogComponent} instance with a custom exchange formatter set-up.
     */
    @Named("log") 
1

    LogComponent log() {
        DefaultExchangeFormatter formatter = new DefaultExchangeFormatter();
        formatter.setShowExchangePattern(false);
        formatter.setShowBodyType(false);

        LogComponent component = new LogComponent();
        component.setExchangeFormatter(formatter);

        return component;
    }
}
Copy to Clipboard Toggle word wrap
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

CDI 在 Quarkus 和 Camel Quarkus 中扮演了一个中央角色,它还提供了第一个类支持。

您可以使用 @Inject@ConfigProperty 和类似的注解,例如,将 Bean 和配置值注入 Camel RouteBuilder,例如:

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.apache.camel.builder.RouteBuilder;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@ApplicationScoped 
1

public class TimerRoute extends RouteBuilder {

    @ConfigProperty(name = "timer.period", defaultValue = "1000") 
2

    String period;

    @Inject
    Counter counter;

    @Override
    public void configure() throws Exception {
        fromF("timer:foo?period=%s", period)
                .setBody(exchange -> "Incremented the counter: " + counter.increment())
                .to("log:cdi-example?showExchangePattern=false&showBodyType=false");
    }
}
Copy to Clipboard Toggle word wrap
1
@ApplicationScoped 注释需要 @Inject@ConfigProperty 才能在 RouteBuilder 中工作。请注意,@ApplicationScoped Bean 由 CDI 容器管理,其生命周期比普通 RouteBuilder 之一更复杂。换句话说,在 RouteBuilder 中使用 @ApplicationScoped 有一定的引导时间损失,因此您应该仅在真正需要时使用 @ApplicationScoped 标注您的 RouteBuilder
2
timer.period 属性的值在 example 项目的 src/main/resources/application.properties 中定义。
提示

如需了解更多详细信息,请参阅 Quarkus 依赖注入指南

5.1. 访问 CamelContext

访问 CamelContext 只是将其注入到 bean 中:

import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;
import java.util.stream.Collectors;
import java.util.List;
import org.apache.camel.CamelContext;

@ApplicationScoped
public class MyBean {

    @Inject
    CamelContext context;

    public List<String> listRouteIds() {
        return context.getRoutes().stream().map(Route::getId).sorted().collect(Collectors.toList());
    }
}
Copy to Clipboard Toggle word wrap

5.2. CDI 和 Camel Bean 组件

5.2.1. 按名称引用 bean

要按名称引用路由定义中的 bean,请使用 @Named ("myNamedBean")@ApplicationScoped 标注 bean。@RegisterForReflection 注释对于原生模式很重要。

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import io.quarkus.runtime.annotations.RegisterForReflection;

@ApplicationScoped
@Named("myNamedBean")
@RegisterForReflection
public class NamedBean {
    public String hello(String name) {
        return "Hello " + name + " from the NamedBean";
    }
}
Copy to Clipboard Toggle word wrap

然后您可以在路由定义中使用 myNamedBean 名称:

import org.apache.camel.builder.RouteBuilder;
public class CamelRoute extends RouteBuilder {
    @Override
    public void configure() {
        from("direct:named")
                .to("bean:namedBean?method=hello");
    }
}
Copy to Clipboard Toggle word wrap

第 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
Copy to Clipboard Toggle word wrap

如果您期望应用程序需要在此集合中未包含的编码,或者您在原生模式中看到 UnsupportedCharsetException 抛出,请将以下条目添加到 application.properties 中:

quarkus.native.add-all-charsets = true
Copy to Clipboard Toggle word wrap

另请参阅 Quarkus 文档中的 quarkus.native.add-all-charsets

7.2. Locale

默认情况下,原生镜像中仅包含构建 JVM 默认区域设置。Quarkus 提供了一种通过 application.properties 设置区域设置的方法,因此您不需要依赖 LANGLC_* environement 变量:

quarkus.native.user-country=US
quarkus.native.user-language=en
Copy to Clipboard Toggle word wrap

还支持将多个区域嵌入到原生镜像中,并通过 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.includesquarkus.native.resources.excludes 属性来完成,如下所示:

quarkus.native.resources.includes = docs/*,images/*
quarkus.native.resources.excludes = docs/ignored.adoc,images/ignored.png
Copy to Clipboard Toggle word wrap

在上例中,名为 docs/included.adocimages/included.png 的资源会嵌入到原生可执行文件中,而 docs/ignored.adocimages/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);
Copy to Clipboard Toggle word wrap

应注册类 mypackage.MyException 进行反映,请参阅 Registering class for reflection

7.5. 注册课程以反应

默认情况下,动态反映在原生模式中不可用。需要反复访问的课程,以便在编译时进行反复注册。

在很多情况下,应用程序开发人员不需要关注,因为 Quarkus 扩展可以检测需要反映的类并自动注册它们。

然而,在某些情况下,Quarkus 扩展可能会错过一些类,由应用程序开发人员注册。有两种方法可以做到这一点:

  1. @io.quarkus.runtime.annotations.RegisterForReflection 注释可用于注册所使用的类,或者通过 targets 属性注册第三方类。
  2. 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
    Copy to Clipboard Toggle word wrap

    要使这些选项正常工作,包含所选类的工件必须包含 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
    Copy to Clipboard Toggle word wrap

7.6. 注册类以进行序列化

如果通过 quarkus.camel.native.reflection.serialization-enabled 来请求序列化支持,则 CamelSerializationProcessor.BASE_SERIALIZATION_CLASSES 中列出的类会自动注册。

用户可以使用 @RegisterForReflection (serialization = true) 注册更多类。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat