1.3. 使用红帽构建的 Apache Camel for Quarkus 构建第一个项目


1.3.1. 概述

您可以使用 code.quarkus.redhat.com 生成 Quarkus Maven 项目,该项目会自动添加并配置要在应用程序中使用的扩展。

本节介绍了使用红帽构建的 Apache Camel for Quarkus 创建 Quarkus Maven 项目的过程,包括:

  • 使用 code.quarkus.redhat.com创建框架应用程序
  • 添加简单的 Camel 路由
  • 探索应用程序代码
  • 在开发模式中编译应用程序
  • 测试应用程序

您可以在 code.quarkus.redhat.com 上引导和生成项目。

红帽构建的 Apache Camel for Quarkus 扩展位于"集成"标题下。

如果您需要额外的扩展,请使用 'search' 字段查找它们。

选择您要处理的组件扩展,然后点 'Generate your application' 下载基本框架项目。

您还可以将项目直接推送到 GitHub。

有关使用 code.quarkus.redhat.com 生成 Quarkus Maven 项目的更多信息,请参阅 Getting started with Red Hat build of Quarkus 指南中的使用 code.quarkus.redhat.com 创建 Quarkus Maven 项目

流程

  1. code.quarkus.redhat.com 网站中,选择以下扩展:

    • camel-quarkus-rest
    • camel-quarkus-jackson
    • camel-quarkus-direct

      注意

      不要在 code.quarkus.redhat.com 上编译应用程序(在流程的最后一步中)。反之,使用下面 第 1.3.5 节 “开发模式” 部分描述的 compile 命令。

  2. 进入从上一步中提取生成的项目文件的目录:

    $ cd <directory_name>
    Copy to Clipboard Toggle word wrap

1.3.3. 探索应用程序代码

应用程序有两个编译依赖关系,它们在 com.redhat.quarkus.platform:quarkus-camel-bom 中导入,它们是在 < dependencyManagement& gt; 中导入的:

pom.xml

<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 3.15.x version from https://maven.repository.redhat.com/ga/com/redhat/quarkus/platform/quarkus-bom -->
</quarkus.platform.version>

...

<dependency>
    <groupId>${quarkus.platform.group-id}</groupId>
    <artifactId>${quarkus.platform.artifact-id}</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>
Copy to Clipboard Toggle word wrap

注意

如需有关 BOM 依赖项管理的更多信息,请参阅使用红帽构建的 Apache Camel for Quarkus 开发应用程序

应用程序由 src/main/resources/application.properties 中定义的属性配置,例如: camel.context.name 可以在其中设置。

1.3.4. 添加简单的 Camel 路由

注意

在本例中,我们使用 camel-quarkus-examples 存储库中的简单示例。它由两个简单的类 Fruit.java,Legume.java 和路由定义 Routes.java 组成。

流程

  1. src/main/java/org/acme/ 子文件夹中创建名为 Fruit.java 的文件。
  2. 添加类,如以下代码片段所示:

    Fruit.java

    package org.acme.rest.json;
    
    import java.util.Objects;
    
    import io.quarkus.runtime.annotations.RegisterForReflection;
    
    /**
     * A REST entity representing a fruit.
     */
    @RegisterForReflection // Lets Quarkus register this class for reflection during the native build
    public class Fruit {
        private String name;
        private String description;
    
        public Fruit() {
        }
    
        public Fruit(String name, String description) {
            this.name = name;
            this.description = description;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Fruit)) {
                return false;
            }
    
            Fruit other = (Fruit) obj;
    
            return Objects.equals(other.name, this.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(this.name);
        }
    }
    Copy to Clipboard Toggle word wrap

  3. src/main/java/org/acme/ 子文件夹中创建名为 Legume.java 的文件。
  4. 添加类,如以下代码片段所示:

    Legume.java

    package org.acme.rest.json;
    
    import java.util.Objects;
    
    import io.quarkus.runtime.annotations.RegisterForReflection;
    
    /**
     * A REST entity representing a legume.
     */
    @RegisterForReflection // Lets Quarkus register this class for reflection during the native build
    public class Legume {
        private String name;
        private String description;
    
        public Legume() {
        }
    
        public Legume(String name, String description) {
            this.name = name;
            this.description = description;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Legume)) {
                return false;
            }
    
            Legume other = (Legume) obj;
    
            return Objects.equals(other.name, this.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(this.name);
        }
    }
    Copy to Clipboard Toggle word wrap

  5. src/main/java/org/acme/ 子文件夹中创建名为 Routes.java 的文件。
  6. 添加 Camel Rest 路由,如以下代码片段所示:

    Routes.java

    package org.acme.rest.json;
    
    import java.util.Collections;
    import java.util.LinkedHashSet;
    import java.util.Set;
    
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.model.rest.RestBindingMode;
    
    /**
     * Camel route definitions.
     */
    public class Routes extends RouteBuilder {
        private final Set<Fruit> fruits = Collections.synchronizedSet(new LinkedHashSet<>());
        private final Set<Legume> legumes = Collections.synchronizedSet(new LinkedHashSet<>());
    
        public Routes() {
    
            /* Let's add some initial fruits */
            this.fruits.add(new Fruit("Apple", "Winter fruit"));
            this.fruits.add(new Fruit("Pineapple", "Tropical fruit"));
    
            /* Let's add some initial legumes */
            this.legumes.add(new Legume("Carrot", "Root vegetable, usually orange"));
            this.legumes.add(new Legume("Zucchini", "Summer squash"));
        }
    
        @Override
        public void configure() throws Exception {
    
            restConfiguration().bindingMode(RestBindingMode.json);
    
            rest("/fruits")
                    .get()
                    .to("direct:getFruits")
    
                    .post()
                    .type(Fruit.class)
                    .to("direct:addFruit");
    
            rest("/legumes")
                    .get()
                    .to("direct:getLegumes");
    
            from("direct:getFruits")
                    .setBody().constant(fruits);
    
            from("direct:addFruit")
                    .process().body(Fruit.class, fruits::add)
                    .setBody().constant(fruits);
    
            from("direct:getLegumes")
                    .setBody().constant(legumes);
        }
    }
    Copy to Clipboard Toggle word wrap

    有关此示例的更多信息,请参阅 camel-quarkus-examples 存储库

1.3.5. 开发模式

$ mvn clean compile quarkus:dev
Copy to Clipboard Toggle word wrap

此命令编译项目、启动应用程序,并允许 Quarkus 工具监视工作区中的更改。对项目所做的任何修改都会在运行的应用程序中自动生效。

您可以在浏览器中检查应用程序。(例如,对于 rest-json 示例应用程序,请访问 http://localhost:8080/fruits。)

如果更改了应用程序代码,例如,将 'Apple' 更改为 'Orange',则应用程序会自动更新。要查看应用的更改,请刷新浏览器。

如需有关 开发模式的更多详细信息, 请参阅 Quarkus 文档开发模式 部分。

1.3.6. 测试

1.3.6.1. JVM 模式

要测试我们在 JVM 模式中创建的 Camel Rest 路由,请添加测试类,如下所示:

流程

  1. src/test/java/org/acme/ 子文件夹中创建名为 RoutesTest.java 的文件。
  2. 添加 RoutesTest 类,如以下代码片段所示:

    RoutesTest.java

    package org.acme;
    
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.Test;
    
    import static io.restassured.RestAssured.given;
    import org.hamcrest.Matchers;
    
    @QuarkusTest
    public class RoutesTest {
    
        @Test
        public void testFruitsEndpoint() {
    
            /* Assert the initial fruit is there */
            given()
                    .when().get("/fruits")
                    .then()
                    .statusCode(200)
                    .body(
                            "$.size()", Matchers.is(1),
                            "name", Matchers.contains("Orange"));
    
            /* Add a new fruit */
            given()
                    .body("{\"name\": \"Pear\"}")
                    .header("Content-Type", "application/json")
                    .when()
                    .post("/fruits")
                    .then()
                    .statusCode(200);
    
            /* Assert that pear was added */
            given()
                    .when().get("/fruits")
                    .then()
                    .statusCode(200)
                    .body(
                            "$.size()", Matchers.is(2),
                            "name", Matchers.contains("Orange", "Pear"));
        }
    
    }
    Copy to Clipboard Toggle word wrap

JVM 模式测试由 test Maven 阶段的 maven-surefire-plugin 运行:

$ mvn clean test
Copy to Clipboard Toggle word wrap

1.3.6.2. 原生模式

要测试我们在 Native 模式中创建的 Camel Rest 路由,请添加测试类,如下所示:

流程

  1. src/test/java/org/acme/ 子文件夹中创建名为 NativeRoutesIT.java 的文件。
  2. 添加 NativeRoutesIT 类,如以下代码片段所示:

    NativeRoutesIT.java

    package org.acme;
    
    import io.quarkus.test.junit.NativeImageTest;
    
    @NativeImageTest
    public class NativeRoutesIT extends RoutesTest {
    
        // Execute the same tests but in native mode.
    }
    Copy to Clipboard Toggle word wrap

    原生模式测试由 verify 阶段的 maven-failsafe-plugin 验证。

  3. 传递 native 属性以激活运行它们的配置集:

    $ mvn clean verify -Pnative
    Copy to Clipboard Toggle word wrap
提示

如需了解更多详细信息,以及如何使用 CamelTestSupport 风格测试,请参阅 测试 Camel Quarkus 扩展

1.3.7. 打包并运行应用程序

1.3.7.1. JVM 模式

流程

  1. 运行 mvn package,以准备在库存 JVM 上运行的精简 jar

    $ mvn clean package
    $ ls -lh target/quarkus-app
    ...
    -rw-r--r--. 1 user user 238K Oct 11 18:55  quarkus-run.jar
    ...
    Copy to Clipboard Toggle word wrap
    注意

    jar 仅包含应用程序代码。您还需要 target/quarkus-app/lib 中的依赖项来运行它。

  2. 运行 jar,如下所示:

    $ java -jar target/quarkus-app/quarkus-run.jar
    ...
    [io.quarkus] (main) Quarkus started in 1.163s. Listening on: http://[::]:8080
    Copy to Clipboard Toggle word wrap
注意

引导时间应该大约是一秒。

1.3.7.2. 原生模式

流程

要准备原生可执行文件,请执行以下操作:

  1. 运行命令 mvn clean package -Pnative

    $ mvn clean package -Pnative
    $ ls -lh target
    ...
    -rwxr-xr-x. 1 user user  46M Oct 11 18:57  code-with-quarkus-1.0.0-SNAPSHOT-runner
    ...
    Copy to Clipboard Toggle word wrap
    注意

    运行程序 没有 .jar 扩展,并且设置了 x (executable)权限。您可以直接运行它:

    $ ./target/*-runner
    ...
    [io.quarkus] (main) Quarkus started in 0.013s. Listening on: http://[::]:8080
    ...
    Copy to Clipboard Toggle word wrap

    应用程序以 13 毫秒启动。

  2. 使用 ps -o rss,command -p $(pgrep code-with) 命令来查看内存用量:

    $ ps -o rss,command -p $(pgrep code-with)
      RSS COMMAND
    65852 ./target/code-with-quarkus-1.0.0-SNAPSHOT-runner
    Copy to Clipboard Toggle word wrap

    应用程序使用 65 MB 内存。

提示

有关准备原生可执行文件的更多信息,请参阅 Compiling your Quarkus applications to native executables 指南中的 Producing a native executable

提示

Quarkus 原生可执行文件 包含更多详细信息,包括 创建容器镜像的步骤

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat