1.3. 使用 Camel Extensions for Quarkus 构建第一个项目


1.3.1. 概述

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

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

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

1.3.2. 生成框架应用程序

项目可以在 code.quarkus.redhat.com 上启动和生成。Quarkus 扩展的 Camel 扩展位于"Integration"标题下。

使用 'search' 字段查找所需的扩展。

选择您要操作的组件扩展,然后单击"增强应用程序"以下载基本框架项目。另外,还有可将项目直接推送到 GitHub 的选项。

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

流程

  1. 使用 code.quarkus.redhat.com 网站,为本例选择以下扩展:

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

      注意

      您不应该按照上述步骤的最后一步所述编译应用程序,因为您将作为本指南的一部分执行该任务。

  2. 导航到您在上一步中提取生成的项目文件的目录:

    $ cd <directory_name>

1.3.3. 探索应用程序代码

应用程序有两个编译依赖项,它们在 com.redhat.quarkus.platform:quarkus-camel-bom 中导入,它们在 < dependencyManagement> 中导入:

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 2.13.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>

注意

有关 BOM 依赖项管理的更多信息,请参阅 使用 Camel Extensions for Quarkus 开发应用程序

该应用由 src/main/resources/application.properties 中定义的属性配置,例如,可以在那里设置 camel.context.name

1.3.4. 添加简单的 Camel 路由

流程

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

    routes.java

    package org.acme;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Objects;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.model.rest.RestBindingMode;
    
    import io.quarkus.runtime.annotations.RegisterForReflection;
    
    public class Routes extends RouteBuilder {
        private final List<Fruit> fruits = new CopyOnWriteArrayList<>(Arrays.asList(new Fruit("Apple")));
    
        @Override
        public void configure() throws Exception {
            restConfiguration().bindingMode(RestBindingMode.json);
    
            rest("/fruits")
                    .get()
                    .route()
                    .setBody(e -> fruits)
                    .endRest()
    
                    .post()
                    .type(Fruit.class)
                    .route()
                    .process().body(Fruit.class, (Fruit f) -> fruits.add(f))
                    .endRest();
    
        }
    
        @RegisterForReflection // Let Quarkus register this class for reflection during the native build
        public static class Fruit {
            private String name;
    
            public Fruit() {
            }
    
            public Fruit(String name) {
                this.name = name;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            @Override
            public int hashCode() {
                return Objects.hash(name);
            }
    
            @Override
            public boolean equals(Object obj) {
                if (this == obj)
                    return true;
                if (obj == null)
                    return false;
                if (getClass() != obj.getClass())
                    return false;
                Fruit other = (Fruit) obj;
                return Objects.equals(name, other.name);
            }
    
        }
    
    }

1.3.5. 开发模式

$ mvn clean compile quarkus:dev

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

在浏览器中检查应用程序,例如 http://localhost:8080/fruits,用于 rest-json 示例。

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

有关开发模式的详情,请参阅 Quarkus 文档 Development 模式 部分。

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"));
        }
    
    }

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

$ mvn clean test

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.
    }

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

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

    $ mvn clean verify -Pnative
提示

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

1.3.7. 打包并运行应用程序

1.3.7.1. JVM 模式

流程

  1. 运行 mvn 软件包,以准备在库存 JVM 上运行的精简 jar:

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

    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
注意

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

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
    ...
    注意

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

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

    应用以 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

    应用程序使用 65 MB 内存。

提示

有关准备 原生可执行文件 的更多信息,请参阅将 Quarkus 应用程序编译到原生可执行文件 指南中的生成原生可执行文件。

提示
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.