Open Liberty 22.0.0.3-beta中用于Jakarta EE 10的并发性3.0

221 阅读3分钟

尽管自从我们在Open Liberty 21.0.0.12中宣布支持Jakarta EE 9.1以来,只有短短几个月的时间,但我们已经在实现Jakarta EE 10的功能。并发3.0标志着我们的第一个Jakarta EE 10测试版功能,在Open Liberty 22.0.0.3-beta中可用。并发3.0引入了各种新的增强功能,包括资源定义注释,使应用程序能够控制定义应用程序所需的并发约束和线程上下文类型,由容器管理的上下文感知的完成阶段等。

所有测试版功能包

Open Liberty的All Beta特性包包含了所有Open Liberty测试版特性和GA特性和功能。 这意味着你现在可以尝试我们正在开发的Open Liberty功能,只需在你的构建工具中添加相关的坐标。 如果你尝试了测试包,让我们知道你的想法

所有测试版功能包包括以下测试版功能:

用于Jakarta EE 10的并发性3.0

Jakarta并发性规范增强了应用程序可用的并行和反应式编程模型集,使任务和完成阶段的动作能够在提交者的线程上下文中运行。

并发3.0包括以下增强功能:

  • 资源定义注解,使应用程序能够控制定义应用程序所需的并发性约束和线程上下文类型。

  • 由容器管理的情境感知的完成阶段。

  • 由上下文感知的完成阶段支持的异步方法。

  • 触发器的改进,根据自己时区的日期和时间定制业务逻辑的调度。

  • 为线程上下文的第三方供应商提供标准化的集成。

在测试阶段,Open Liberty允许这个Jakarta EE 10功能与Jakarta EE 9功能一起使用,这样你就可以在现有的应用程序中试用它。在你的server.xml ,启用concurrent-3.0 功能。

<featureManager>
    <feature>concurrent-3.0</feature>
</featureManager>

你仍然可以像以前版本的功能那样,在<managedExecutorService> 和其他并发性资源类型中配置server.xml

然而,Conurrency 3.0让你有能力在应用程序组件中定义这些资源:

import static jakarta.enterprise.concurrent.ContextServiceDefinition.ALL_REMAINING;
import static jakarta.enterprise.concurrent.ContextServiceDefinition.APPLICATION;
import static jakarta.enterprise.concurrent.ContextServiceDefinition.SECURITY;
import static jakarta.enterprise.concurrent.ContextServiceDefinition.TRANSACTION;

import jakarta.annotation.Resource;
import jakarta.enterprise.concurrent.ContextServiceDefinition;
import jakarta.enterprise.concurrent.ManagedExecutorDefinition;
import jakarta.enterprise.concurrent.ManagedExecutorService;
import jakarta.inject.Inject;
import jakarta.servlet.http.*;

import java.sql.*;
import java.util.concurrent.CompletionException;

@ContextServiceDefinition(name = "java:app/concurrent/AppContextOnly",
        propagated = APPLICATION,
        cleared = { TRANSACTION, SECURITY },
        unchanged = ALL_REMAINING)
@ManagedExecutorDefinition(name = "java:module/concurrent/MyExecutor",
        context = "java:app/concurrent/AppContextOnly",
        maxAsync = 5)
public class MyServlet extends HttpServlet {
    @Resource(name = "java:module/env/concurrent/MyExecutorRef",
              lookup = "java:module/concurrent/MyExecutor")
    ManagedExecutorService myExecutor;

    @Inject AccountsBean accounts;
    ...

启用CDI功能后,返回CompletionStageCompletableFuture 的方法可以通过注解@Asynchronous ,指定为异步运行:

import jakarta.enterprise.concurrent.Asynchronous;
import jakarta.inject.Singleton;

import java.sql.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

@Singleton
public class AccountsBean {

    @Asynchronous(executor = "java:module/concurrent/MyExecutor")
    CompletableFuture<List<Account>> findOverdue(int minDaysLate) {
        List<Account> overdueAccounts = new ArrayList<Account>();
        try {
            // Resource reference lookup requires context of the application component,
            DataSource db = InitialContext.doLookup("java:comp/env/jdbc/account-db-ref");
            ...
            return Asynchronous.Result.complete(overdueAccounts);
        } catch (NamingException | SQLException x) {
            throw new CompletionException(x);
        }
    }

    ...

当应用程序调用异步方法时,容器会拦截该调用并交回一个代表其最终完成的完成阶段,该阶段由ManagedExecutorService

    public void doGet(HttpServletRequest req, HttpServletResponse res) {
        ...
        accounts.findOverdue(60).thenAccept(this::sendReminder);
        ...
    }

    void sendReminder(List<Account> overdue) {
        try {
            // Resource reference lookup requires context of the application component,
            DataSource db = InitialContext.doLookup("java:comp/env/jdbc/customer-db-ref");
            ...
        } catch (NamingException | SQLException x) {
            throw new CompletionException(x);
        }
    }

并发3.0规范还没有发布,因为Jakarta EE 10还在开发中。然而,你可以在concurrency-api GitHub页面上预览它的草案。

同样,在规范发布之前,Maven上也不会有API jar,但与此同时,你可以查看草案副本

    <repositories>
        <repository>
            <id>ibmdhe</id>
            <name>IBM_DHE File Server</name>
            <url>https://public.dhe.ibm.com/ibmdl/export/pub/software/olrepo</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>io.openliberty.jakarta.enterprise.concurrent</groupId>
            <artifactId>jakarta.enterprise.concurrent-api</artifactId>
            <version>3.0.0.20220120</version>
        </dependency>
    <dependencies>

现在就试试吧

要尝试这些功能,只需更新你的构建工具,拉取Open Liberty All Beta功能包,而不是主版本。该测试版适用于Java SE 17、Java SE 11或Java SE 8。

如果你使用Maven,这里有坐标:

<dependency>
  <groupId>io.openliberty.beta</groupId>
  <artifactId>openliberty-runtime</artifactId>
  <version>22.0.0.3-beta</version>
  <type>pom</type>
</dependency>

或者对于Gradle

dependencies {
    libertyRuntime group: 'io.openliberty.beta', name: 'openliberty-runtime', version: '[22.0.0.3-beta,)'
}

或者看一下我们的下载页面