我想将异步模式CompletableFuture Java 8用于servlet。
但找到的信息:
仅在EJB规范中禁止创建线程。为了使容器更健壮,应在整个服务器过程中将其禁止使用。将线程创建从EJB移至例如Servlet不是一个合理的解决方案。
...
Enterprise Bean不得尝试管理线程。企业bean不得尝试启动,停止,挂起或恢复线程,也不能更改线程的优先级或名称。企业bean不得尝试管理线程组。“
使用CompletableFuture是否安全?是否可以保证异步任务的正确执行?
如评论中所述,这取决于您打算如何使用它。
在EE环境中,唯一合法的线程池/执行者服务是托管执行者:
https://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/ManagedExecutorService.html
受管理,因为它是服务器管理和提供的资源,可以注入到您的EJB中。
@Resource(name = "wm/executorService")
ManagedExecutorService managedExecutorService;
已经注入了这样的资源,您有资格运行CompletableFuture的异步方法,只要明确提供此托管执行程序即可:
CompletableFuture<Void> result = CompletableFuture.runAsync(
yourBean::yourMethod,
managedExecutorService);