26

编写简单的 MicroProfile 应用程序,第 3 部分: 使用 Java EE 并发性

 5 years ago
source link: http://www.ibm.com/developerworks/cn/java/j-tutorials-write-a-simple-microprofile-application-3/index.html?ca=drs-&%3Butm_source=tuicool&%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

使用 Java EE 并发性

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

Yan Koyfman

2019 年 3 月 19 日发布

系列内容:

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

https://www.ibm.com/developerworks/cn/library/?series_title_by=**auto**

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

此内容是该系列的一部分: 编写简单的 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)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK