编写简单的 MicroProfile 应用程序,第 3 部分

使用 Java EE 并发性

执行异步任务以进行后台维护

Comments

系列内容:

此内容是该系列 4 部分中的第 # 部分: 编写简单的 MicroProfile 应用程序,第 3 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:编写简单的 MicroProfile 应用程序,第 3 部分

敬请期待该系列的后续内容。

概述

在本教程中,将在应用程序中执行一些异步任务,以执行后台维护。

到目前为止,在启动会议时,链接会被存储到电子会议中,但在会议结束时永远不会被删除。这意味着下次开始运行会议时,会将所有人都重定向到原先的会议,这显然是不对的。您要确保在会议结束后停用此 URL。在本文中,我们将使用 Concurrency Utilities for Java EE 来实现此目的。

改编自博客文章:“编写简单的 MicroProfile 应用程序:使用 Java EE 并发性”。

前提条件

  • 已完成“编写简单的 MicroProfile 应用程序,第 2 部分:添加持久性”。
  • Eclipse IDE for Web Developers:运行安装程序并选择 Eclipse IDE for Java EE Developers。

    注意:这些步骤在 Linux 和 Liberty Developer Tools 18.0.0.3 上运行的 2018-09 版 Eclipse 上进行了测试。

    注意:如果遇到类似于 Could not initialize class org.codehaus.plexus.archiver.jar.JarArchiver 的错误消息,可参阅“故障排除”部分。

  • IBM Liberty Developer Tools (WDT)
    1. 启动 Eclipse。
    2. 启动 Eclipse Marketplace:Help > Eclipse Marketplace
    3. 搜索 IBM Liberty Developer Tools,在已选中默认配置的情况下单击 Install
  • Git
  • 安装 IBM Cloud CLI

步骤

1 检出源代码

  1. 从命令行运行以下命令:
    git clone https://github.com/IBM/microprofile-meeting-concurrency.git
  2. 在 Eclipse 中,将项目作为现有项目导入。
    1. 在 Eclipse 中,切换至 Git 透视图。
    2. 单击 Git Repositories 视图中的 Clone a Git repository
    3. 输入 URI:https://github.com/IBM/microprofile-meeting-concurrency.git
    4. 单击 Next,然后再次单击 Next,接受默认值。
    5. Initial branch 下拉列表中,单击 master
    6. 选择 Import all existing Eclipse projects after clone finishes,然后单击 Finish
    7. 切换至 Java EE 透视图。
    8. 在 Project Explorer 视图中会自动创建会议项目。

2 安装 MongoDB

如果您已完成先前的教程并且安装了 MongoDB,确保 MongoDB 正在运行。如果要重新开始,确保安装 MongoDB。根据您所使用的平台,安装说明可能会有所不同。对于本练习,您应该从 mongoDB 下载中心获取 MongoDB 的社区版本。

在安装后,可以使用以下命令运行 MongoDB 数据库守护程序:

mongod -dbpath <path to database>

数据库必须正在运行,应用程序才能正常工作。如果数据库未在运行,服务器日志中会有很多噪音数据。

3 更新应用程序以根据 Concurrency API for Java EE 进行编译

要开始编写代码,必须更新 Maven pom.xml,指明对 Concurrency API for Java EE 的依赖:

  1. 在 Eclipse 中打开 pom.xml
  2. 在编辑器中,选择 Dependencies 选项卡。
  3. Dependencies 选项卡上有两个部分,一个部分用于 Dependencies,另一个部分用于 Dependency Management。在 Dependencies 框的右侧,有一个 Add 按钮。单击 Add 按钮。
  4. groupdId 中输入 javax.enterprise.concurrent
  5. artifactId 中输入 javax.enterprise.concurrent-api
  6. version 中输入 1.0
  7. scope 下拉列表中选择 provided。这将允许应用程序进行编译,但会阻止 Maven WAR 打包器将 API 放入 WAR 文件中。稍后将配置构建,使其可供服务器使用。
  8. 单击 OK
  9. 保存 pom.xml

4 更新 MeetingManager 以结束会议

  1. 从以下位置打开 MeetingManager 类:meetings > Java Resources > src/main/java > net.wasdev.samples.microProfile.meetings > MeetingManager.java
  2. 在类定义下方 DB 定义之后,注入 ManagedScheduledExecutorService
    @Resource
       private ManagedScheduledExecutorService executor;
  3. 这引入了一个新类,即 ManagedScheduledExecutorService,它位于 javax.enterprise.concurrent 包中:
    import javax.enterprise.concurrent.ManagedScheduledExecutorService;
  4. 查找 startMeeting 方法。我们将在其中放置用于结束会议的逻辑。
  5. 将所有代码放在方法的最末尾。将安排该事件运行,并且不需要响应,因为我们只需要确保它稍后发生即可。在所有编译错误消失之前,将会执行多个步骤。代码将调用已注入的 ManagedScheduledExecutorServiceschedule 方法,这需要 Runnable、持续时间以及持续时间的单位。
    1. 首先,让我们从数据库中获取会议持续时间。在数据库中为 Long,但 get 方法只返回 Object。如果我们将其强制转换为 number,然后调用 longValue,就会收到 Long,如果代码稍后变动,改为添加 Integer,那么将有一定的弹性:
      long duration = ((Number)obj.get("duration")).longValue();
    2. 定义时间单位。实际上,会议持续时间以分钟或小时为单位来衡量。正确的代码为:
      TimeUnit unit = TimeUnit.MINUTES;

      但这并不十分适用于演示/样本目的,因此改为添加:

      TimeUnit unit = TimeUnit.SECONDS;

      这引入了新类 TimeUnit,它位于 java.util.concurrent 包中:

      import java.util.concurrent.TimeUnit;
    3. 下一步将添加 run 方法,您必须在其中找到除去会议所需的条目。为此,我们需要访问封闭方法中的 id 变量。要访问 id 变量,必须将其标记为 final。因此,将 startMeeting 方法中的第一个变量声明更新为:
      final String id = meeting.getString("id");
    4. 调用注入的 ManagedScheduledExecutorServiceschedule 方法,传入类型为 Runnable 的匿名内部类:
      executor.schedule(new Runnable() {
        
                @Override
                public void run() {
                    // code will be added here
                }
            }, duration, unit);
    5. 与涉及数据模型的所有事项一样,首先要做的是获取 MongoDB 集合。此代码应进入上面添加的 run 方法:
      DBCollection coll = getColl();
    6. 接下来,获取表示会议的 DBObject
      DBObject obj = coll.findOne(id);
    7. 重新设置会议 URL 与除去字段一样简单:
      obj.removeField("meetingURL");
    8. 然后,需要将其重新保存到 MongoDB:
       coll.save(obj);
    9. 一切就绪。但由于一些事项对于调试目的而言是异步的,因此最好将一些内容写入日志。您可以使用合适的日志记录 API,但在此情况下, System.out 已足够好。在 run 方法的末尾,添加以下代码:
      System.out.println(id + " meeting ended");
  6. 保存该文件。

5 配置 Liberty 以运行 Concurrency Utilities for Java EE

  1. 通过 src > main > liberty > config > server.xml 打开 server.xml
  2. 查找 featureManager 元素。它应类似如下:
    <featureManager>
           <feature>mongodb-2.0</feature>
       </featureManager>
  3. </featureManager> 结束元素之前,添加 feature 元素,并以 concurrent-1.0 功能作为主体。
    <feature>concurrent-1.0</feature>
  4. 保存该文件。

6 确保 Concurrency Utilities for Java EE 可用

Concurrency Utilities for Java EE 不是 Java EE Web 概要文件的一部分,这意味着如果使用此 Liberty 分发版,该功能将不可用。Liberty 应用加速器生成的 pom.xml 取决于 Java EE Web 概要文件分发版,因此您必须从 Liberty Repository 安装 concurrent-1.0,或者引入更大的 Java EE 全平台分发版:

  1. 打开 pom.xml
  2. 在编辑器中切换至 pom.xml 选项卡。
  3. 安装 concurrent-1.0 功能:
    1. 搜索 mongodb-2.0
    2. 添加另一个 feature 元素,但此时提及 concurrent-1.0

      在此更改之后,您应该会看到如下内容:

      <features>
                <feature>mongodb-2.0</feature>
                <feature>concurrent-1.0</feature>
            </features>
  4. 保存该文件

一些最终想法

观察敏锐的人会注意到这个逻辑存在一个缺陷:容错能力不强。如果有一场会议时长 90 分钟,而服务器崩溃或重新启动,此会议将永不结束。可以采用一些神奇的方法来解决这个问题,我们改日再来练习。

运行应用程序

可以使用两种方法从 WDT 中运行应用程序:

  1. 第一种方法是使用 Maven 来构建和运行项目:
    1. 运行 Maven install 目标来构建和测试项目:右键单击 meetings 项目中的 pom.xml,单击 Run As… > Maven Build…,然后在 Goals 字段中输入 install,并单击 Run。第一次运行此目标时,可能会花几分钟时间来下载 Liberty 依赖项。
    2. liberty:start-server goal 运行 Maven 构建:右键单击 pom.xml,单击 Run As… > Maven Build,然后在 Goals 字段中输入 liberty:start-server,并单击 Run。这会在后台启动服务器。
    3. 打开应用程序(地址为 http://localhost:9080/meetings/)。
    4. 要再次停止服务器,可运行 liberty:stop-server 构建目标。
  2. 第二种方法是右键单击 meetings 项目,并选择 Run As… > Run on Server。但如果这样做,须注意一些事项。WDT 不会像您期望的那样自动添加 MicroProfile 功能,因此您需要手动添加这些功能。此外,除非添加 include,否则不会选取 src/main/liberty/config 中发生的任何配置更改。

本文翻译自:Write a simple MicroProfile application, Part 3: Use Java EE concurrency (2019-02-04)


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=1065204
ArticleTitle=编写简单的 MicroProfile 应用程序,第 3 部分: 使用 Java EE 并发性
publish-date=03192019