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 项目。
流程
使用 code.quarkus.redhat.com 网站,为本例选择以下扩展:
-
camel-quarkus-rest
camel-quarkus-jackson
注意您不应该按照上述步骤的最后一步所述编译应用程序,因为您将作为本指南的一部分执行该任务。
-
导航到您在上一步中提取生成的项目文件的目录:
$ 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 路由
流程
-
在
src/main/java/org/acme/
子文件夹中,创建名为Routes.java
的文件。 添加 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 路由,请添加测试类,如下所示:
流程
-
在
src/test/java/org/acme/
子文件夹中,创建名为RoutesTest.java
的文件。 添加
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 路由,请添加测试类,如下所示:
流程
-
在
src/test/java/org/acme/
子文件夹中,创建名为NativeRoutesIT.java
的文件。 添加
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
验证
。传递
native
属性来激活运行它们的配置集:$ mvn clean verify -Pnative
如需了解更多详细信息,以及如何使用 CamelTestSupport
风格测试,请参阅 测试 Camel Quarkus 扩展。
1.3.7. 打包并运行应用程序
1.3.7.1. JVM 模式
流程
运行
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
中的依赖项来运行它。运行 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. 原生模式
流程
要准备原生可执行文件,请执行以下操作:
运行命令
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 毫秒启动。
使用
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 应用程序编译到原生可执行文件 指南中的生成原生可执行文件。
Quarkus 原生可执行文件指南包含 更多详细信息,包括 创建容器镜像的步骤。