4.3. MicroProfile Fault Tolerance 应用程序开发


4.3.1. 添加 MicroProfile 容错扩展

MicroProfile Fault Tolerance 扩展包含在 standalone-microprofile.xmlstandalone-microprofile-ha.xml 配置中,它们作为 JBoss EAP XP 的一部分提供。

该扩展不包括在标准的 standalone.xml 配置中。要使用扩展,您必须手动启用它。

先决条件

  • 已安装 EAP XP pack。

流程

  1. 使用以下管理 CLI 命令添加 MicroProfile 容错扩展:

    /extension=org.wildfly.extension.microprofile.fault-tolerance-smallrye:add
    Copy to Clipboard Toggle word wrap
  2. 使用以下命令启用 microprofile-fault-tolerance-smallrye 子系统:

    /subsystem=microprofile-fault-tolerance-smallrye:add
    Copy to Clipboard Toggle word wrap
  3. 使用以下管理命令重新载入服务器:

    reload
    Copy to Clipboard Toggle word wrap

4.3.2. 为 MicroProfile Fault Tolerance 配置 Maven 项目

创建一个具有所需依赖项的 Maven 项目,以及用于创建 MicroProfile Fault Tolerance 应用的目录结构。

先决条件

  • 已安装 Maven。

流程

  1. 设置 Maven 项目:

    mvn archetype:generate \
        -DgroupId=com.example.microprofile.faulttolerance \
        -DartifactId=microprofile-fault-tolerance \
        -DarchetypeGroupId=org.apache.maven.archetypes \
        -DarchetypeArtifactId=maven-archetype-webapp \
        -DinteractiveMode=false
    cd microprofile-fault-tolerance
    Copy to Clipboard Toggle word wrap

    该命令创建项目的目录结构以及 pom.xml 配置文件。

  2. 要让 POM 文件自动管理 jboss-eap-xp-microprofile BOM 中 MicroProfile Fault Tolerance 工件的版本,请将 BOM 导入到项目 POM 文件的 & lt;dependencyManagement > 部分。

    <dependencyManagement>
      <dependencies>
        <!-- importing the microprofile BOM adds MicroProfile specs -->
        <dependency>
            <groupId>org.jboss.bom</groupId>
            <artifactId>jboss-eap-xp-microprofile</artifactId>
            <version>${version.microprofile.bom}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    Copy to Clipboard Toggle word wrap

    将 ${version.microprofile.bom} 替换为安装的 BOM 版本。

  3. 将由 BOM 管理的 MicroProfile Fault Tolerance 工件添加到项目 POM 文件的 & lt;dependency > 部分。以下示例演示了将 MicroProfile Fault Tolerance 依赖项添加到该文件中:

    <!-- Add the MicroProfile Fault Tolerance API. Set provided for the <scope> tag, as the API is included in the server. -->
    <dependency>
      <groupId>org.eclipse.microprofile.fault.tolerance</groupId>
      <artifactId>microprofile-fault-tolerance-api</artifactId>
      <scope>provided</scope>
    </dependency>
    Copy to Clipboard Toggle word wrap

4.3.3. 创建容错应用程序

创建一个容错应用程序,为容错实施重试、超时和回退模式。

先决条件

  • 已配置了 Maven 依赖项。

流程

  1. 创建用于存储类文件的目录:

    $ mkdir -p APPLICATION_ROOT/src/main/java/com/example/microprofile/faulttolerance
    Copy to Clipboard Toggle word wrap

    APPLICATION_ROOT 是包含应用的 pom.xml 配置文件的目录。

  2. 进入新目录:

    $ cd APPLICATION_ROOT/src/main/java/com/example/microprofile/faulttolerance
    Copy to Clipboard Toggle word wrap

    对于以下步骤,请在新目录中创建所有类文件。

  3. 创建一个简单的实体,其代表 Coffee 示例为 Coffee.java,其内容如下:

    package com.example.microprofile.faulttolerance;
    
    public class Coffee {
    
        public Integer id;
        public String name;
        public String countryOfOrigin;
        public Integer price;
    
        public Coffee() {
        }
    
        public Coffee(Integer id, String name, String countryOfOrigin, Integer price) {
            this.id = id;
            this.name = name;
            this.countryOfOrigin = countryOfOrigin;
            this.price = price;
        }
    }
    Copy to Clipboard Toggle word wrap
  4. 创建包含以下内容的类文件 CoffeeApplication.java

    package com.example.microprofile.faulttolerance;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("/")
    public class CoffeeApplication extends Application {
    }
    Copy to Clipboard Toggle word wrap
  5. 创建包含以下内容的 Jakarta 上下文和依赖注入 Bean 作为 CoffeeRepositoryService.java

    package com.example.microprofile.faulttolerance;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class CoffeeRepositoryService {
    
        private Map<Integer, Coffee> coffeeList = new HashMap<>();
    
        public CoffeeRepositoryService() {
            coffeeList.put(1, new Coffee(1, "Fernandez Espresso", "Colombia", 23));
            coffeeList.put(2, new Coffee(2, "La Scala Whole Beans", "Bolivia", 18));
            coffeeList.put(3, new Coffee(3, "Dak Lak Filter", "Vietnam", 25));
        }
    
        public List<Coffee> getAllCoffees() {
            return new ArrayList<>(coffeeList.values());
        }
    
        public Coffee getCoffeeById(Integer id) {
            return coffeeList.get(id);
        }
    
        public List<Coffee> getRecommendations(Integer id) {
            if (id == null) {
                return Collections.emptyList();
            }
            return coffeeList.values().stream()
                    .filter(coffee -> !id.equals(coffee.id))
                    .limit(2)
                    .collect(Collectors.toList());
        }
    }
    Copy to Clipboard Toggle word wrap
  6. 创建包含以下内容的类文件 CoffeeResource.java

    package com.example.microprofile.faulttolerance;
    
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.atomic.AtomicLong;
    import javax.inject.Inject;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import java.util.Collections;
    import javax.ws.rs.PathParam;
    import org.eclipse.microprofile.faulttolerance.Fallback;
    import org.eclipse.microprofile.faulttolerance.Timeout;
    import org.eclipse.microprofile.faulttolerance.Retry;
    
    @Path("/coffee")
    @Produces(MediaType.APPLICATION_JSON)
    public class CoffeeResource {
    
        @Inject
        private CoffeeRepositoryService coffeeRepository;
    
        private AtomicLong counter = new AtomicLong(0);
    
        @GET
        @Retry(maxRetries = 4) 
    1
    
        public List<Coffee> coffees() {
            final Long invocationNumber = counter.getAndIncrement();
            return coffeeRepository.getAllCoffees();
        }
    
    
        @GET
        @Path("/{id}/recommendations")
        @Timeout(250) 
    2
    
        public List<Coffee> recommendations(@PathParam("id") int id) {
                return coffeeRepository.getRecommendations(id);
            }
    
        @GET
        @Path("fallback/{id}/recommendations")
        @Fallback(fallbackMethod = "fallbackRecommendations") 
    3
    
        public List<Coffee> recommendations2(@PathParam("id") int id) {
            return coffeeRepository.getRecommendations(id);
            }
    
        public List<Coffee> fallbackRecommendations(int id) {
            //always return a default coffee
            return Collections.singletonList(coffeeRepository.getCoffeeById(1));
        }
    }
    Copy to Clipboard Toggle word wrap
    1
    定义重新应用到 4 的数量。
    2
    以毫秒为单位定义超时间隔。
    3
    定义在调用失败时调用的回退方法。
  7. 进入应用程序的根目录:

    $ cd APPLICATION_ROOT
    Copy to Clipboard Toggle word wrap
  8. 使用以下 Maven 命令构建应用程序:

    $ mvn clean install wildfly:deploy
    Copy to Clipboard Toggle word wrap

    访问位于 http://localhost:8080/microprofile-fault-tolerance/coffee 的应用。

其它资源

  • 有关容错应用的详细示例,包括用于测试应用的容错性故障,请参阅 microprofile-fault-tolerance Quickstart。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部